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教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(13)
PHPz

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

巴扎黑

变成了全局变量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 的一个更安全的备选来提供跨域通信...

黄舟

因为此时的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对象了

伊谢尔伦

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

ringa_lee

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

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

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