javascript的疑问?
大家讲道理
大家讲道理 2017-04-11 13:22:36
[JavaScript讨论组]
var foo = {
    bar:function(){
        console.log(this);
    }
}
foo.bar();
(foo.bar)();
(foo.bar = foo.bar)();//window
(foo.bar,foo.bar)();//window
(false || foo.bar)();//window

谁帮忙解释下后三个为什么呀???

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(4)
迷茫

这问题很有意思!

原因是没有直接使用 foo 做为context

var bar = foo.bar; // 只引用bar函数, 跟foo没关系了
bar(); // window
// 以下其实都是bar函数, 已经脱离了foo context
bar == (foo.bar = foo.bar);  // true
bar == (foo.bar,foo.bar); // true
bar == (false || foo.bar); // true

所以很多时候我们都是

obj.foo();
obj.foo2();

// 而不是
var foo = obj.foo;
foo(); // 会失去obj context
PHP中文网
(foo.bar)();

此时foo.bar作为变量,还没有作为语句被计算过,还未丢失foo,调用的时候等同foo.bar().

(foo.bar = foo.bar)();//window

foo.bar = foo.bar是一个语句,调用时执行该语句返回一个function,已丢失foo,又因为全局调用,所以this被赋值为当前全局对象。

(foo.bar,foo.bar)();//window

同上,作为语句被执行

(false || foo.bar)();//window

同上

阿神

这些原理性质的东西听别人讲再多也没用,任何揣测都是没有必要的,查规范才是最佳选择,可以参考下我的这个回答链接

迷茫

简单来讲后三个函数调用左边不是内部引用类型,所以函数调用确定的 this 是 undefined,在非严格模式下内部会设置为 全局对象。具体看这篇博客 https://m2mbob.cn/2016/09/25/...

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

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