日期:2014-05-16  浏览次数:20366 次

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

?

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

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

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

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

第三个,f3 === obj === f4 指向一块内存.
3 楼 北极的。鱼 2011-04-25  
limu 写道
第一个,toString()返回的是字符串,只要字符串内容相等,即便在内存中有2份,那也是全等.

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

第三个,f3 === obj === f4 指向一块内存.





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

第二个,return function 相当于 return new Function,
能再说清楚点吗?这句话什么意思啊?
我能隐约感觉到你要表达的意思,但还是不很明朗,请大侠再赐教。
4 楼 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了两次,占了两块地儿,就是俩东西,不等,不全等.



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