`
北极的。鱼
  • 浏览: 160817 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JS大牛们请进,很疑惑的问题等待中。。。

 
阅读更多

请看代码:

【1:】

var obj=function()
{
    var MyFunc=function()
    {
        alert("hello world");
    }
    return function()
    {
        return MyFunc();
    }
}
var f3=obj();
var f4=obj();
alert(f3.toString()===f4.toString());//true

【2:】

var obj=function()
{
    var MyFunc=function()
    {
        alert("hello world");
    }
    return function()
    {
        return MyFunc();
    }
}
var f3=obj();
var f4=obj();
alert(f3==f4);//false(连等于都为false,严格等于更为false)

 

【3:】

var obj=function()
{
    var MyFunc=function()
    {
        alert("hello world");
    }
    return function()
    {
        return MyFunc();
    }
}()
var f3=obj;
var f4=obj;
alert(f3===f4);//true

 

请问各位大牛,怎么解释?

0
4
分享到:
评论
6 楼 limu 2011-04-26  
北极的。鱼 写道
limu 写道
当然对于基本类型,new创建和直接创建差别很大的.
比如 s = "a" 和 s = new String("a");
还有new Boolean ,new Number这些.



+++++++++++++++++++++++++++++++++++++++++++++++++++++++++

恍然大悟,豁然开朗,谢谢大神。

function foo(){alert(1);}
基本相当于(还是有些许差别,但在你的问题上是一致的)
var foo = function(){alert(1);};

你说的这句话,能不能解释下呢?我的理解是一个语句,一个是表达式,表达式可以在实例化之前就能调用,而语句必须在声明后才能调用。请问你说的差别是不是这点?


当然对于基本类型,new创建和直接创建差别很大的.
还有这句话,能不能解释下?差别在何处?



头一个问题你说的没错,不管叫语句还是叫什么的吧.function(){}这种,只要在当前<script>块的任何位置定义过,就可以在任何位置调用,包括这句话之前.而var foo = function(){};这种,调用要在赋值的后边.. 这是个比较重要的区别,
再细微的差别,包括各浏览器,各脚本引擎实现上的不同,还是有,就不是一两句话能说清了.也包括s = "a" 和 s = new String("a")的差别.这些看看书吧.犀牛或者JS高级编程.

不烦英文的话推荐http://dmitrysoshnikov.com/ecmascript/javascript-the-core/ 这系列文章.
5 楼 北极的。鱼 2011-04-26  
limu 写道
当然对于基本类型,new创建和直接创建差别很大的.
比如 s = "a" 和 s = new String("a");
还有new Boolean ,new Number这些.



+++++++++++++++++++++++++++++++++++++++++++++++++++++++++

恍然大悟,豁然开朗,谢谢大神。

function foo(){alert(1);}
基本相当于(还是有些许差别,但在你的问题上是一致的)
var foo = function(){alert(1);};

你说的这句话,能不能解释下呢?我的理解是一个语句,一个是表达式,表达式可以在实例化之前就能调用,而语句必须在声明后才能调用。请问你说的差别是不是这点?


当然对于基本类型,new创建和直接创建差别很大的.
还有这句话,能不能解释下?差别在何处?
4 楼 limu 2011-04-25  
当然对于基本类型,new创建和直接创建差别很大的.
比如 s = "a" 和 s = new String("a");
还有new Boolean ,new Number这些.
3 楼 limu 2011-04-25  
首先var foo = new bar(); 前边有个new,这就相当于按照bar()的指引生成了一个新对象,新对象就会占用一块新的内存以存储.

所以再来一句var foo2 = new bar(); 那么foo2和foo是两个对象,占了两块内存.那么一般情况下 foo和foo2不会相等 更不会全等.

如果能理解这个,接下来再需要搞清楚几种隐藏的new的生成对象方法.
比如 foo = {} 这句话相当于 foo = new Object();
那么 再来一句:foo2 = {}  自然有foo != foo2

接下来 foo = [] 相当于 foo = new Array();

function foo(){alert(1);}
基本相当于(还是有些许差别,但在你的问题上是一致的)
var foo = function(){alert(1);};
相当于
var foo = new Function("alert(1)");
如果有个foo2,当然也是不等于foo的.

所以说对象,数组,函数的定义,写法上隐去了new,但是实际上和new一样,是生成了新的对象,在内存中占了新的地方的..


在你的代码中
return function(){}
就相当于
var foo = new Function(){};
return foo;
你的obj调用两次,那么上面这段话执行2次,就new了两次,占了两块地儿,就是俩东西,不等,不全等.



2 楼 limu 2011-04-25  
第一个,toString()返回的是字符串,只要字符串内容相等,即便在内存中有2份,那也是全等.

第二个,return function 相当于 return new Function看到new了? 每个new都会新生成一个对象,占用一块内存,所以f3 != f4

第三个,f3 === obj === f4 指向一块内存.
1 楼 refinement_code 2011-04-25  
var obj=function()  
{  
    var MyFunc=function()  
    {  
        alert("hello world");  
    }  
    return function()  
    {  
        return MyFunc();  
    }  
}
var f3=obj();  
var f4=obj();
var f5=obj();

f3,f4,f5 是运行了三次obj方法分别得到的返回值,这三个值是不同的,因为每次运行obj,obj方法都产生了一个新的域(scope),所以每次返回的 MyFunc 都是这个新产生的域下的MyFunc,f3 f4 f5 分别对应三个域下的MyFunc



var obj=function()  
{  
    var MyFunc=function()  
    {  
        alert("hello world");  
    }  
    return function()  
    {  
        return MyFunc();  
    }  
}() 
var f3=obj;  
var f4=obj;
var f5=obj;

这个obj相当于上一个的obj方法的返回值,所以f3 f4 f5 代表相同的MyFunc

相关推荐

    JS加载等待效果

    在加载等待效果中,这些特效可能包括旋转的加载图标、渐进式的进度条,或者是动态填充的内容背景。 - 使用JavaScript可以实现高度定制化的动画效果,同时确保在数据加载完成时能够及时、平滑地关闭加载指示器,显示...

    一个相对完善的js loading等待效果例子

    结合这些资源,开发者可以学习到如何在JavaScript中创建一个完整的加载等待效果,包括如何使用CSS控制元素的可见性、如何使用JavaScript处理异步操作,以及如何通过调整DOM元素来反馈加载状态。此外,还可以学习到...

    Javascript打开页面等待效果

    在网页加载过程中,用户可能会遇到长时间等待的情况,此时为了提供更好的用户体验,我们可以使用JavaScript来实现页面加载等待效果。这种效果通常被称为“加载指示器”或“进度条”,它可以让用户知道页面正在加载,...

    js实现页面等待特效

    然后在JavaScript中更新进度: ```javascript function updateProgress(value) { var progressBar = document.getElementById('loadingBar'); progressBar.value = value; } // 示例:模拟加载进度 var ...

    cocos-js服务器nodejs牛牛游戏(上线运营过)

    《cocos-js与Node.js构建的牛牛游戏服务器详解》 在移动游戏开发领域,Cocos引擎因其高效、易用的特性,深受开发者喜爱。而结合Node.js的强大后端能力,可以构建出高性能的游戏服务器。本篇文章将深入探讨使用Cocos...

    牛牛截图js插件(资源很棒,需要一定要下载)

    JavaScript(JS)是Web开发中的主要脚本语言,它允许在浏览器端运行代码,为用户提供动态交互体验。牛牛截图js插件利用了JS的事件监听、DOM操作以及图像处理等功能,实现了用户可以在网页上自由选择截图区域,然后...

    js加载等待效果

    "js加载等待效果"是一种技术手段,用于提升用户体验,确保用户在等待内容加载时能够有所感知,避免因页面无响应而产生疑惑或不耐烦。这个效果通常通过JavaScript实现,结合CSS和HTML,为用户提供一个视觉上的反馈,...

    一个拿来就用的js等待窗口类

    本资料提供了一个拿来就用的js等待窗口类,实现了等待窗口功能的完全集成,不再需要在标签中添加有关内容,等待窗口可根据信息字符串的宽度自动调整窗口宽度,动态信息是一个旋转的弧梯形。通过本例,你可以掌握以下...

    很牛B的javascript对战系统

    标题提到的"很牛B的javascript对战系统"显然是一项使用JavaScript实现的互动应用,它可能是一个在线游戏或者模拟战斗的示例,允许用户控制虚拟人物进行对战。这种系统通常涉及到多个核心的JavaScript技术,包括DOM...

    js 等待特效

    在JavaScript编程中,"等待特效"通常指的是在用户操作或数据加载过程中显示的一种视觉反馈,让用户知道程序正在执行任务并请他们稍等片刻。这种特效能够提升用户体验,避免用户因看不到任何进度而频繁点击或者失去...

    两种风格的等待层

    另一种风格的等待层是"页面等待中"的提示,通常表现为一个中心突出的加载图标,如旋转的菊花或无限循环的线条,配以简单的文字,如"请稍候..."或"加载中..."。这种设计旨在告知用户页面正在后台处理数据,但并不会...

    js 实现 提交信息等待界面

    js 实现 提交信息等待界面! 值得下载看看!资源免费,大家分享!!

    javascript 等待时间

    javascript 下载资源时或是注册信息时经常会遇到倒计时的等待时间 的一个方法

    两个比较好用的Eclipse中javascript插件jsEditor jsEclipse

    总的来说,jsEditor和jsEclipse都是Eclipse中不可或缺的JavaScript开发工具,它们通过丰富的特性和服务,帮助开发者提高生产力,降低出错概率,使JavaScript编程更加轻松愉快。无论你是新手还是经验丰富的开发者,都...

    js加载等待效果,原理点击后创建层,onclick事件触发

    JavaScript加载等待效果是一种常见用户体验优化技术,用于在数据加载期间向用户展示反馈,告知他们系统正在处理请求。这种效果通常会在用户点击按钮或链接后显示,直到后台数据完全加载完毕。下面将详细介绍实现这一...

    异步数据加载时,所用的等待组件,JS源码,类似于UI Block

    在JavaScript中实现这样的加载组件,开发者通常会结合使用事件监听、回调函数、Promise或者async/await语法来管理异步操作。例如,当AJAX请求启动时,显示加载指示器;当请求完成,无论是成功还是失败,都隐藏加载...

    js制作多彩等待窗口

    多彩等待窗口在网络不畅的情况下,以丰富多彩的形式给用户一个网络为他正忙的信息,对用户无疑是有好的。 本例提供的方法,可以任由您的想想,创建有意境的等待窗口,丰富用户对您的web产品的印象。

    七牛js文件上传,含后台代码,获取 token

    在这个项目中,我们看到的"七牛js文件上传,含后台代码,获取 token"是一个完整的解决方案,包括前端JavaScript代码和后端Java代码,用于实现在网页上向七牛云存储上传文件,并在上传前获取必要的上传凭证(token)...

    JavaScript结课大作业.zip

    事件处理是JavaScript中关键的一部分,它允许程序在用户与页面交互时执行特定的代码。在旅游网站中,可能会有各种点击事件、鼠标悬停事件、表单提交事件等,通过绑定事件监听器,可以实现诸如导航菜单响应、预订按钮...

    json3.js 【JS / JavaScript 中解析JSON的js包,JSON官方的JSON解析包】

    JavaScript中解析JSON的js包,页面中引入json3.js,即可使用。 使用方法:JSON.parse(str), JSON.stringify(obj) 更多详情请参考博文: JavaScript中解析JSON --- JSON.parse()、JSON.stringify()以及$.parseJSON()...

Global site tag (gtag.js) - Google Analytics