javascript - 除了第一题的值是20好理解,剩下的不好理解?
黄舟
黄舟 2017-04-10 16:04:39
[JavaScript讨论组]
var x = 10;
var foo = {
    x: 20,
    bar: function () {
        var x = 30;
        return this.x;
    }
};
console.log(
    foo.bar(),                 //    20.
    (foo.bar)(),               //    20.
    (foo.bar = foo.bar)(),     //    10.
    (foo.bar, foo.bar)()       //    10.
);
黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回复(2)
PHPz

这题考的主要知识点是同名变量覆盖和上下文this的问题。

(foo.bar)()这个是取得表达式foo.bar的值,然后执行它,和foo.bar()是一样的。

(foo.bar = foo.bar)()这个就有意思了,它是把foo.bar赋给foo.bar,感觉好像啥都没做是不是?但就是因为这个赋值语句,让bar方法脱离了它原本的上下文foo,变成了一个全局函数。因为JS中赋值语句是有副作用的,除了赋值,还会把这个值返回。
实际上这句代码相当于:

var temp = (foo.bar = foo.bar);
temp();

这时候的temp指向foo.bar,但此时的this却不再是foo,而是全局对象(window)。因为全局变量相当于window的属性,所以返回的是全局变量x的值10

(foo.bar, foo.bar)()这个同理,逗号运算符会依次执行每个子表达式,并返回最右的那个子表达式的值。

黄舟

在 bar 中 console.log(this), 查看this 指向的是哪

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

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