首页 > 一道小面试题

一道小面试题

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

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


首先,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,正确结果就是这个了。


this指向已经改变,如下做就好:

var newFunction = obj1.fn.bind(obj1);

具体解释请看我的这个笔记:关于javascript中this的trick


obj1.fn 的指向是:function(){alert(this.name),所以,把 obj1.fn换成function(){alert(this.name),就很明白了

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


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


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


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

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


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


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


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


因为此时的this指向window对象,this关键字在JS中的使用一定要弄明白哦,哈哈面试必考题之一吧
推荐楼主看这篇文章http://javascriptissexy.com/understand-javascripts-this-with-clarity-and-master-it/


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

【热门文章】
【热门文章】