JavaScript 中的嵌套函数和 “this” 关键字

Nested functions & the "this" keyword in JavaScript

本文关键字:this 关键字 函数 嵌套 JavaScript      更新时间:2023-09-26

"this 关键字始终引用包含函数作为其方法的对象。

太好了,听起来很简单,但这就是我想知道的......

例如:

function func1() {
  function func2() {
    alert(this == window); // true
  }
  func2();
  alert(this == window); // true
}
func1.func3 = function () {
  alert(this == window); // false
  alert(this == func1); // true
};
func1();
func1.func3();

现在,由于func1实际上是全局(window(对象(分配给全局对象的属性func1的函数对象(的方法,因此func1内部的this引用全局对象是有意义的,并且由于func3func1函数对象的方法,因此func3内部的this引用func1的函数对象是有意义的。

困扰我的是func2.我知道嵌套函数中的this也应该引用全局对象,但我不确定为什么func2因为它不是全局对象的方法。据我了解(这是我可能完全错误的部分(,func2是一种func1调用(激活/变量(对象的方法。现在,如果我是对的(我不确定我是不是(,那么this不应该func2内部引用func1的调用对象而不是全局对象吗?

所以,我想我的问题是:嵌套函数是它嵌套的函数的调用(激活(对象的方法吗,如果是这样,this不应该引用该调用对象而不是全局对象?

this 关键字始终引用包含函数作为其方法的对象。

不。不幸的是,这并不容易。MDN 上 this 关键字的文档给出了一个很好的概述。当函数作为方法调用时,它被设置为对象,但还有其他可能性。默认情况下,当调用this时,undefined没有任何特殊功能,就像您对 func1func2 所做的那样。对于草率(非严格(模式函数undefined(和null(不使用,在这种情况下,this确实指向它们的全局对象(window在浏览器中( - 您正在观察的内容。

但是,当函数作为构造函数调用(使用 new 关键字(时,它也可以指向新的对象实例,或者在用作处理程序时指向事件目标(如 DOM 元素(。最后但并非最不重要的一点是,它可以手动设置 callapplybind ...

this与嵌套无关。嵌套函数声明/表达式仅影响变量的范围("隐私",可用性(。虽然函数的变量范围永远不会改变,但每次调用时this的值可能会不同 - 它更像是一个额外的参数。

> 函数中 this 关键字的含义取决于调用函数的方式。JavaScript 中有 4 种不同的函数调用模式。

  1. 函数调用模式foo()
  2. 方法调用模式o.foo()
  3. 构造函数调用模式new foo
  4. 调用/应用模式foo.apply(...)foo.call(...)

只有在 #2 中,函数内部的this才引用函数作为方法的对象。

您正在使用函数调用模式调用func2()。这样做时,this引用全局对象。

如 @Bergi 所建议的,有关this的含义和不同函数调用模式的更多详细信息,请参阅 https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/this。

但我不确定为什么,因为 func2 不是全局对象的方法。

函数

内定义的任何事物都是该函数范围的本地事物。所以func2属于func1的局部范围,因此不隶属于window

在 Javascript 中,this的值通常基于您调用函数的方式。当您调用没有任何前导对象的函数时,this通常设置为全局父对象,即 window

可以通过三种方式显式设置this的值:

myObj.func(a, b); //this set to myObj implicitly because myObj is the parent 
func.call(myObj, a, b); //this set to myObj explicitly; the first argument 
                        //to call sets the value of this for that function
func.apply(myObj, [a, b]); //this set to myObj explicitly; the first argument
                           //to apply also sets the value of this for that
                           //function.

this可能是一个棘手的概念。MDN有一篇关于this的好文章。