学习函数的时候,总有个疑问,不明白,如图:
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
总结下,就会发现:
当返回的变量是函数作用域之外声明的对象就会出现相等;
仔细想想:
因为任意两个对象都是不等的,除非引用的是同一个对象,才会出现相等;而且返回函数作用域之外声明的变量,实际上返回的只是一个引用,所以 当返回的变量是函数作用域之外声明的对象就会出现相等,上面的情况就能理解了 。
那么为什么,
返回函数作用域之内声明的对象就会不等呢?
想当然的话好像的确应该是这样,但究竟是为什么呢?
仔细想想,可能是:
因为函数每次执行时,都创建一个执行环境,把活动对象作为变量对象添加到作用域链的前端,每次调用,就会执行一次代码,创建多次多个不同的变量,最后把相应变量在内存中的地址返回出来,然后执行环境销毁,保存在其中的所有其他变量和函数定义也随之销毁,所以每次返回出来的都是保存在内存中的一个新变量,所以如果是引用类型的,当然返回出来的都是不同的内存地址,对应不同的对象;
参考文档: