[英]Understanding “this” within anonymous function in JavaScript
在这个岗位 ,很多答案都在那里讨论this
在JavaScript中的关键字。 但是,我仍然在anonymous function
this
感到困惑,如下所示
// MyModule.js
'use strict';
(function(handler) {
// export methods
handler.B = B;
handler.A = A;
function A() {
console.log(this);
console.log('function A is invoked...');
}
function B() {
console.log(this);
console.log('function B is invoked...');
try {
A();
this.A();
} catch (err) {
console.log('Exception is ' + err);
}
}
})(module.exports);
// test.js
var myModule = require('MyModule.js');
myModule.B();
输出:(在Node.js下运行)
{ B: [Function: B], A: [Function: A] }
function B is invoked...
undefined
function A is invoked...
{ B: [Function: B], A: [Function: A] }
function A is invoked...
输出表明函数A
在两个不同的范围内。 我对吗? 为什么函数A
有两个作用域?
众所周知, this
与范围有关。 并且MyModule
匿名函数中的this
是undefined
。 根据输出,函数A
的范围之一是undefined
,另一个是{ B: [Function: B], A: [Function: A] }
。 它们之间有什么区别?
this
和范围几乎没有任何关系。 在JavaScript中, this
通常是由设置的功能如何被调用 ,而不是在那里的定义。 (该规则有两个例外,我将在下面提及它们。)
所以,当你调用A
,你设置什么this
将是调用(主要是隐含的)期间。 执行此操作时:
A();
......你调用A
没有做任何明确的设置什么this
是应该的; 其结果是,你是隐式调用它this
设置为undefined
,因为你的代码是严格模式。 (如果它是松散的模式,你可以用它调用this
设置为全局对象的引用。)这也是值得注意的是,你解决标识A
经通过调用创建您的匿名函数的情况下,包含A
和B
作为(有效)变量。
但在这儿:
this.A();
...您正在调用A
作为从对象属性获取函数引用的表达式的一部分( A
;请注意,这对A
是不同的含义,但是属性和上下文变量都引用同一函数)。 这样做的行为要求A
与this
设置为你从得到的属性的对象的引用。
这就是为什么你看到两个不同的值this
在A
。
“ this
是通过您的调用方式设置的”规则的例外情况是:
ES6的“箭头”的功能,它继承了this
从他们创造文意 (未范围)。
ES5的“绑定”功能(调用的结果.bind
上的功能参考),已经this
被烤成他们.bind
呼叫,所以总是看到相同的值this
。
通常, this
函数在函数中绑定到调用该函数的对象。
在您的示例中:
myModule.B()
, this
等于myModule
,从输出中可以看到: { B: [Function: B], A: [Function: A] }
try
块内调用不带对象的A()
, this
是undefined
因为您正在严格模式下运行,否则它将指向全局对象 ,该对象是浏览器中的window
或节点中的global
this.A()
,这里您基本上是将当前的this
( myModule
)传递给函数,因此它将是myModule
。 整个this
绑定仅受调用函数的方式影响。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.