Javascript 为什么“this”指的是父函数';s范围
我确实读到过Javascript 为什么“this”指的是父函数';s范围,javascript,Javascript,我确实读到过这个关键字可以引用全局范围、它所引用的对象或事件绑定到的对象,但下面的行为不被理解 函数外部(){ var内部=4; 函数innerFunc(){ var内部=5; console.log('内部调用'+this.internal); } 返回innerFunc; } var obj=外部(); obj()TL;DR-此的工作方式与您认为的不一样 多读一些,然后 函数的此(也称为上下文)在调用时确定,而不是在函数定义时确定。这被广泛称为动态绑定的,来自闭包的变量是词汇绑定的 使用
这个
关键字可以引用全局范围、它所引用的对象或事件绑定到的对象,但下面的行为不被理解
函数外部(){
var内部=4;
函数innerFunc(){
var内部=5;
console.log('内部调用'+this.internal);
}
返回innerFunc;
}
var obj=外部();
obj()代码>TL;DR-此
的工作方式与您认为的不一样
多读一些,然后
函数的此
(也称为上下文)在调用时确定,而不是在函数定义时确定。这被广泛称为动态绑定的,来自闭包的变量是词汇绑定的
使用this=window
(或者在Node.js中使用global
)调用outer
,因为您没有处于严格模式(否则,this=undefined
)<代码>外部
不使用此
,因此这不会对其产生太大影响
outer
然后返回一个函数(innerFunc
),并将其分配给obj
。然后再次使用this=window
调用obj
(因为您没有使用或指定任何其他内容)
然后记录this.internal
,它相当于window.internal
,它是未定义的
,除非您碰巧有一个名为internal
的全局变量,并带有一些值
此
的值由调用方确定
如果您像这样调用了obj
:
obj.call({inner: 42}); // first argument to fn.call() is the context
无论函数是如何定义的,您都会在控制台中看到42
缓解此问题并保持对
此
的控制的一种方法是使用或。在本例中,您使用的是函数而不是对象。此外,您还使用了一个变量而不是this
关键字来分配值。我认为您考虑的概念是本地范围界定
比如说,
function parent(){
var n = 5
function child(){
var n = 4 //n is 4 here
}
//n is 5 here
}
您的代码段返回的是未定义的,而不是4。原因是
窗口通过调用obj()
调用innerFunc
。因此,这个
指的是窗口
,因为这就是所谓的innerFunc
(而window.inner
是未定义的
)。您可以通过在代码顶部添加变量internal=3
(这将使window.internal=3
)看到这一点,因此您的函数将记录3
internal=3;//ie:window.internal=3
函数外部(){
var内部=4;
函数innerFunc(){
var内部=5;
console.log('内部调用'+this.internal);//这是窗口
}
返回innerFunc;
}
var obj=外部();
obj()代码>两者都不做,它记录未定义的
此
是此调用的全局对象,基本上是因为没有理由将其作为任何其他对象。请让代码段运行此
不引用任何函数,尽管这是一个常见且可以理解的误解。我建议读这本书的前两章:@RobinZigmond My Bad。我在开发人员工具中随机执行函数,我可能将x全局定义为4。刷新窗口时开始显示未定义。抬起头除非您使用new
function parent(){
var n = 5
function child(){
var n = 4 //n is 4 here
}
//n is 5 here
}