`
北极的。鱼
  • 浏览: 150937 次
  • 性别: 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

相关推荐

Global site tag (gtag.js) - Google Analytics