gpt4 book ai didi

javascript - 表达式评估 - 为什么括号会更改 "this"引用?

转载 作者:行者123 更新时间:2023-11-29 18:07:50 25 4
gpt4 key购买 nike

考虑示例模块创建,为什么括号会更改 this 引用?

作为section 11.2.2 in JavaScript specification说:

The production NewExpression : new NewExpression is evaluated as follows:

  1. Let ref be the result of evaluating NewExpression.
  2. Let constructor be GetValue(ref).
  3. If Type(constructor) is not Object, throw a TypeError exception.
  4. If constructor does not implement the [[Construct]] internal method, throw a TypeError exception.
  5. Return the result of calling the [[Construct]] internal method on constructor, providing no arguments (that is, an empty list of arguments).

经过一些调查,在以下方面没有差异(存在吗?):

console.log(new (modules.getModule('foo')).method)
console.log(new (modules.getModule('foo')).method())

在两个示例中都执行了方法

更有趣:

console.log(typeof new modules.getModule('foo').method) // function
console.log(typeof new (modules.getModule('foo')).method) // object

这些差异的根源是什么?

var modules = (function() {
var definitions = {
foo: {
method: function() {
this.thing = 'baz';
}
}
};

return {
getModule: function(name) {
if(name in definitions) {
return definitions[name];
}
}
};
}());


alert('this: ' + new modules.getModule('foo').method()) // undefined
alert('this: ' + new (modules.getModule('foo')).method()) // {this.thing = 'baz'}

最佳答案

括号不会更改方法调用的 this 引用。括号更改 new 求值的 NewExpression

如果 new 运算符在属性链(一个表达式后跟访问器)的前面,它将评估链并实例化生成的构造函数。

如果 new 运算符在调用表达式(表达式,可能包括访问器,后跟参数列表)之前,调用将为 new操作。任何尾随访问器都将访问新实例化对象的属性。

对于你的例子,这意味着

 new  modules.getModule ('foo') .method
new modules.getModule ('foo') .method()
// are evaluated as
(new (modules.getModule)('foo'))…
// on which then .method is accessed or called

new (modules.getModule('foo')).method
new (modules.getModule('foo')).method ()
// are evaluated as
new (( … ).method)() // the empty parentheses are optional for `new`

(modules.getModule('foo')).method
// just evaluates to the `method` function
(modules.getModule('foo').method)

关于javascript - 表达式评估 - 为什么括号会更改 "this"引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29965778/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com