javascript - 一道小面试题
高洛峰
高洛峰 2017-04-11 10:01:38
[JavaScript讨论组]
var obj1 = {name : "blue",fn : function(){alert(this.name);}};
var newFunction = obj1.fn;
newFunction();

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

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(11)
巴扎黑

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

天蓬老师

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

function() {
    alert(this.name)
}

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

PHP中文网

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

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

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

PHPz

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

ringa_lee

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

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

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

伊谢尔伦

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

ringa_lee

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

高洛峰

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

PHP中文网

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号