var obj1 = {name : "blue",fn : function(){alert(this.name);}};
var newFunction = obj1.fn;
newFunction();
为啥alert的是空,确不是undefined ?
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指向已经改变,如下做就好:
var newFunction = obj1.fn.bind(obj1);
具体解释请看我的这个笔记:关于javascript中this的trick
函数中的this
所指向的上下文对象由实际运行时决定,当使用obj.fn()
调用函数fn
时,函数fn
中的this
指向的上下文对象为obj
,当直接将函数fn
的引用赋值给newFunction
后,此时调用newFunction()
时,其中的this
已经脱离了obj
这个执行上下文。而JavaScript
执行时的默认上下文为window
这个全局对象,而此时window
对象中并没有定义window.name
这个属性,所以面试官希望得到的回答是undefined
,正确结果就是这个了。
因为此时的this指向window对象,this
关键字在JS中的使用一定要弄明白哦,哈哈面试必考题之一吧
推荐楼主看这篇文章http://javascriptissexy.com/understand-javascripts-this-with-clarity-and-master-it/
var obj1 = {name : "blue",fn : function(){alert(this === window);}};
var newFunction = obj1.fn;
newFunction();
运行一下这段代码 这时候的this已经是window对象了
obj1.fn 的指向是:function(){alert(this.name),所以,把 obj1.fn换成function(){alert(this.name),就很明白了
8 回答4.6k 阅读✓ 已解决
6 回答3.3k 阅读✓ 已解决
5 回答2.8k 阅读✓ 已解决
5 回答6.3k 阅读✓ 已解决
4 回答2.2k 阅读✓ 已解决
4 回答2.7k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
this指向已经是window了。
我在Chrome控制台输入
window
,发现它有name
属性,而且为空。