一道小面试题

var obj1 = {name : "blue",fn : function(){alert(this.name);}};
var newFunction = obj1.fn;
newFunction();

为啥alert的是空,确不是undefined ?

阅读 5k
13 个回答

this指向已经是window了。
我在Chrome控制台输入window,发现它有name属性,而且为空。
clipboard.png

变成了全局变量window, window貌似是有name属性的。。。坑

首先,obj1.fn 指向一个匿名函数

function() {
    alert(this.name)
}

之后,该匿名函数又被赋予变量 newFunction,最后是通过 newFunction 进行调用,则函数的上下文 this 则变为 window. 而 window 上 name 属性,name 属性为窗口的名称,其值为字符串,没有设置的情况下为空字符串,则是 window.name 为 ''. 所以alert为'',一个空字符串

函数中的this所指向的上下文对象由实际运行时决定,当使用obj.fn()调用函数fn时,函数fn中的this指向的上下文对象为obj,当直接将函数fn的引用赋值给newFunction后,此时调用newFunction()时,其中的this已经脱离了obj这个执行上下文。而JavaScript执行时的默认上下文为window这个全局对象,而此时window对象中并没有定义window.name这个属性,所以面试官希望得到的回答是undefined,正确结果就是这个了。

window有name这个属性的,获取/设置窗口的名称,一般用于作为 JSONP 的一个更安全的备选来提供跨域通信...
image

var obj1 = {name : "blue",fn : function(){alert(this === window);}};
var newFunction = obj1.fn;
newFunction();

运行一下这段代码 这时候的this已经是window对象了

name比较特殊,不建议将其作为属性,可以考虑将其作为自己的保留字

新手上路,请多包涵

我试了下alert(window.name)确实显示为空 ,web storm提示window有该属性的...哈,好坑

在这里面this已经改变了指向 谁调用这个函数this就指向谁 在这里面this已经指向了window 所以name为空

在这里面this已经改变了指向 谁调用这个函数this就指向谁 在这里面this已经指向了window 所以name为空。

obj1.fn 的指向是:function(){alert(this.name),所以,把 obj1.fn换成function(){alert(this.name),就很明白了
推荐问题
宣传栏