JavaScript 对象函数和 `this` 未绑定并在 expression/parens 中返回时
JavaScript object functions and `this` when unbound and returned in expression/parens
第 1-2 行和第 4-5 行在 this
returned 方面是有意义的。关于第 3 行,我缺少什么?我认为它会 return window
类似于第 4-5 行。在这 5 个中是否还有其他模式可以帮助证明原因?
foo = { bar : function () { return this } }
foo.bar() // ==> foo
(foo.bar)() // ==> foo / but why?
(foo.bar ? foo.bar : $.noop)() // ==> window
(foo.bar || 0)() // ==> window
分组运算符不会破坏 属性 引用,这些引用引发 方法 调用。
这在the spec中明确提到:
NOTE: This algorithm does not apply GetValue to the result of
evaluating Expression
. The principal motivation for this is so that
operators such as delete
and typeof
may be applied to parenthesised
expressions.
在第 4 行和第 5 行中,取消引用 属性 并生成 "unbound" 的不是括号,而是运算符(?:
和 ||
)功能。
foo.bar
这里是匿名函数
如果将它分成不同的行可能更有意义:
foo = {
bar: function() {
return this;
}
}
因此,当您调用 foo.bar
时,您将得到 function() { return this; }
。在第二行,你直接调用那个函数(foo.bar()
),所以它returns this
,对象的实例(foo
).
在第三行,你会得到相同的结果,因为你不是 仅 请求匿名函数,而是执行该函数:
(foo.bar); // (function() { return this; }); A reference to the function
(foo.bar)(); // (function() { return this; })(); Actually calling the function
因为在后一种情况下,您正在执行第二行中的函数,结果是相同的 (foo
)。
然而,在第四行和第五行中,正如 Bergi 所说,您使用的运算符从函数中取消引用它们,这使您得到一个 Window
对象而不是 foo
.
第 1-2 行和第 4-5 行在 this
returned 方面是有意义的。关于第 3 行,我缺少什么?我认为它会 return window
类似于第 4-5 行。在这 5 个中是否还有其他模式可以帮助证明原因?
foo = { bar : function () { return this } }
foo.bar() // ==> foo
(foo.bar)() // ==> foo / but why?
(foo.bar ? foo.bar : $.noop)() // ==> window
(foo.bar || 0)() // ==> window
分组运算符不会破坏 属性 引用,这些引用引发 方法 调用。
这在the spec中明确提到:
NOTE: This algorithm does not apply GetValue to the result of evaluating
Expression
. The principal motivation for this is so that operators such asdelete
andtypeof
may be applied to parenthesised expressions.
在第 4 行和第 5 行中,取消引用 属性 并生成 "unbound" 的不是括号,而是运算符(?:
和 ||
)功能。
foo.bar
这里是匿名函数
如果将它分成不同的行可能更有意义:
foo = {
bar: function() {
return this;
}
}
因此,当您调用 foo.bar
时,您将得到 function() { return this; }
。在第二行,你直接调用那个函数(foo.bar()
),所以它returns this
,对象的实例(foo
).
在第三行,你会得到相同的结果,因为你不是 仅 请求匿名函数,而是执行该函数:
(foo.bar); // (function() { return this; }); A reference to the function
(foo.bar)(); // (function() { return this; })(); Actually calling the function
因为在后一种情况下,您正在执行第二行中的函数,结果是相同的 (foo
)。
然而,在第四行和第五行中,正如 Bergi 所说,您使用的运算符从函数中取消引用它们,这使您得到一个 Window
对象而不是 foo
.