我确实读过this
关键字既可以引用全局范围,也可以引用它所引用的对象,也可以引用事件绑定到的对象,但是以下行为是无法理解的。
function outer() {
var inner = 4;
function innerFunc() {
var inner = 5;
console.log('inner called with ' + this.inner);
}
return innerFunc;
}
var obj = outer();
obj();
为什么此日志4而不是5。AFAIK this
应该引用其所引用的功能,并且应该可以通过closure
使用。
答案 0 :(得分:2)
TL; DR-this
不能像您认为的那样工作。
函数的this
(也称为上下文)是在调用时间而不是在函数定义时确定的。众所周知,this
是动态绑定的,闭包中的变量是动态绑定的 。
var obj = outer();
obj();
使用outer
(在Node.js中为this = window
)调用global
,因为您未处于严格模式(否则为this = undefined
)。 outer
不使用this
,因此不会对其产生太大影响。
outer
然后返回一个函数(innerFunc
),然后将其分配给obj
。然后,您再次用obj
呼叫this = window
(因为您没有用.bind()
或.call()
或.apply()
指定其他任何内容)。
然后登录this.inner
,它等效于window.inner
的{{1}},除非您碰巧有一个名为undefined
的全局变量,并且有一些值。
然后inner
的值由调用方确定。
如果您像这样调用this
:
obj
无论功能如何定义,您都将在控制台中看到42。
减轻这种情况并保持对obj.call({inner: 42}); // first argument to fn.call() is the context
的控制的一种方法是使用fn.bind()
或arrow function。
答案 1 :(得分:1)
您的代码段返回的是undefined
,而不是4。其原因是因为window
通过调用innerFunc
来调用obj()
。因此,this
是指window
,因为这就是所谓的innerFunc
(而window.inner
是undefined
)。您可以通过在代码顶部添加一个变量inner = 3
(这将使window.inner = 3
)可见,这样您的函数将记录3
。
inner = 3; // ie: window.inner = 3
function outer() {
var inner = 4;
function innerFunc() {
var inner = 5;
console.log('inner called with ' + this.inner); // this is window
}
return innerFunc;
}
var obj = outer();
obj();
答案 2 :(得分:0)
在此示例中,您使用的是功能而不是对象。此外,您使用变量而不是this
关键字来分配值。我认为您正在考虑的概念是local scoping
例如,
function parent(){
var n = 5
function child(){
var n = 4 //n is 4 here
}
//n is 5 here
}