函数多次调用返回的变量不是同一个

学习函数的时候,总有个疑问,不明白,如图:

function f(){    
    return function(){};
}

g=f();
h=f();
g===h;//false

不仅仅如此,即使返回非匿名函数,也是不等的,比如:

function f(){    
    return function x(){};
}

g=f();
h=f();
g===h;//false

乍一看,似乎很正常,但是总是说不出来为什么,再拓展下:

function f(){   
    let i={}; 
    return i;
}

g=f();
h=f();
g===h;//false

那么好了,什么时候会出现相等呢?

function f(){   
    let i=arguments.callee; 
    return i;
}

g=f();
h=f();
g===h;//true

或者:

let i={}; 
function f(){       
    return i;
}

g=f();
h=f();
g===h;//true

总结下,就会发现:

当返回的变量是函数作用域之外声明的对象就会出现相等;

仔细想想:

因为任意两个对象都是不等的,除非引用的是同一个对象,才会出现相等;而且返回函数作用域之外声明的变量,实际上返回的只是一个引用,所以 当返回的变量是函数作用域之外声明的对象就会出现相等,上面的情况就能理解了 。

那么为什么,

返回函数作用域之内声明的对象就会不等呢?

想当然的话好像的确应该是这样,但究竟是为什么呢?

仔细想想,可能是:

因为函数每次执行时,都创建一个执行环境,把活动对象作为变量对象添加到作用域链的前端,每次调用,就会执行一次代码,创建多次多个不同的变量,最后把相应变量在内存中的地址返回出来,然后执行环境销毁,保存在其中的所有其他变量和函数定义也随之销毁,所以每次返回出来的都是保存在内存中的一个新变量,所以如果是引用类型的,当然返回出来的都是不同的内存地址,对应不同的对象;

参考文档:

JavaScript高级程序设计-第3版-中

JavaScript权威指南-第6版-中

posted @ 2018-01-30 07:34  xianshenglu  阅读(380)  评论(0编辑  收藏  举报