首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JavaScript对象函数和在表达式/parens中未绑定并返回的“`this`”

JavaScript对象函数和在表达式/parens中未绑定并返回的“`this`”
EN

Stack Overflow用户
提问于 2015-04-11 16:31:34
回答 2查看 435关注 0票数 10

根据返回的this,第1-2行和第4-5行是有意义的。3号线我遗漏了什么?我以为它会返回类似于第4-5行的window。难道这5中没有另一种模式可以帮助说明原因吗?

代码语言:javascript
运行
复制
foo = { bar : function () { return this } }

foo.bar() // ==> foo

(foo.bar)() // ==> foo / but why?

(foo.bar ? foo.bar : $.noop)() // ==> window

(foo.bar || 0)() // ==> window
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-11 16:54:31

分组运算符不会破坏正在引发方法调用的属性引用。

规格中明确提到了这一点

注意:该算法没有将GetValue应用于评估Expression的结果。这样做的主要动机是,可以将deletetypeof等运算符应用于带括号的表达式。

在您的第4和第5行中,取消引用属性并生成"unbound“函数的不是括号,而是操作符(?:||)。

票数 9
EN

Stack Overflow用户

发布于 2015-04-11 17:02:13

foo.bar这里是一个匿名函数。

如果将其分成不同的行,可能会更有意义:

代码语言:javascript
运行
复制
foo = {
    bar: function() {
        return this;
    }
}

所以,当你打电话给foo.bar时,你得到的是function() { return this; }。在第二行,直接调用该函数(foo.bar()),因此它返回this,对象的实例(foo)。

在第三行,您得到了相同的结果,因为您不仅要求匿名函数,而且还执行该函数:

代码语言:javascript
运行
复制
(foo.bar); // (function() { return this; }); A reference to the function
(foo.bar)(); // (function() { return this; })(); Actually calling the function

因为在后一种情况下,您正在执行函数,就像在第二行中那样,结果是相同的(foo)。

然而,在第4行和第5行中,正如Bergi所说的那样,您使用的操作符将它们从函数中取消引用,这将留给您一个Window对象,而不是foo

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29580252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档