var name = "this window";
var object = {
name: "my object",
getNameFun: function(){
// return function(){
return this.name;
// }
}
}
console.log((object.getNameFun = object.getNameFun)()); //输出“this window”
console.log(object.getNameFun());//输出my object
上例中object.getNameFun = object.getNameFun)()
是何意?为什么会输出this window
?
var test;
var test1 = function test(){
var name = "test";
return function(){
var name = "test1";
return function(){
console.log(name);
}
}
}
console.log(test); //输出为undefined
console.log(test1); //输出为test函数
为什么上述代码中不能正确输出test,而是显示undefined,但是输出test1的时候却又正常输出test的呢?
一开始以为是test1替代了test,指向了这个函数结构,test指针所以为undefined,但是却发现输出test1不是匿名函数,而是test()函数?
求教~
搞懂这个问题当然要看ES规范,单纯考猜测和看一些书是不行的。
这个问题有两个关键点:
赋值表达式
(命名的)函数表达式
我们分别来看一下:
第一个问题:
首先是一个赋值表达式,然后是一个函数调用表达式。
首先看赋值表达式,根据规范:
https://es5.github.io/#x11.13.1
赋值表达式一共六个步骤,其他的不管,关键看第六步:表达式的结果就是
rval
。这个rval是第三步得到的也就
GetValue(rref)
。这个操作将一个引用类型取值了。相当于把object.getNameFun
中的object.
信息丢掉了,只返回了它的真实值,也就是那个函数对象。最终相当于:
结果很明显了。
第二个问题:
实际上定义了一个命名的函数表达式。
见:https://es5.github.io/#x13 中的第三种形式。而且规范里专门说了:
所以,test在外部是
undefined
也非常明显了。不信你在函数体内打印一下。