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
}