考慮示例模塊的創建,爲什麼括號更改this
參考?表達式評估 - 爲什麼括號更改「this」引用?
由於section 11.2.2 in JavaScript specification說:
生產NewExpression:
- 讓裁判是評估NewExpression的結果:新NewExpression爲 如下評價。
- 讓構造函數成爲GetValue(ref)。
- 如果Type(構造函數)不是Object,則拋出TypeError異常。
- 如果構造函數不執行
[[Construct]]
內部方法,則拋出TypeError異常。- 返回 的結果調用
[[Construct]]
內部方法的構造函數,沒有提供 參數(即參數的空列表)。
經過一番調查後,沒有差異之間(有哪些?):
console.log(new (modules.getModule('foo')).method)
console.log(new (modules.getModule('foo')).method())
在這兩種樣品執行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'}
我不知道它背後的所有技術原因,但如果它是'new modules.foo.method()'而不是'modules.getModule('foo')。method()',它不會返回undefined。它與Javascript如何確定要傳遞什麼對象以用作'this'變量有關。 'new(modules.getModule('foo')。method)()'也可以。順便說一句,我無法重現你的類型的例子。 –
Mine typeof顯示爲函數 –
@ShekharPankaj - 我在檢查typeof時錯過了第二個例子中的new操作符;/- updated –