JavaScript 中的嵌套函数和 “this” 关键字
Nested functions & the "this" keyword in JavaScript
"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
引用全局对象是有意义的,并且由于func3
是func1
函数对象的方法,因此func3
内部的this
引用func1
的函数对象是有意义的。
困扰我的是func2
.我知道嵌套函数中的this
也应该引用全局对象,但我不确定为什么func2
因为它不是全局对象的方法。据我了解(这是我可能完全错误的部分(,func2
是一种func1
调用(激活/变量(对象的方法。现在,如果我是对的(我不确定我是不是(,那么this
不应该func2
内部引用func1
的调用对象而不是全局对象吗?
所以,我想我的问题是:嵌套函数是它嵌套的函数的调用(激活(对象的方法吗,如果是这样,this
不应该引用该调用对象而不是全局对象?
this 关键字始终引用包含函数作为其方法的对象。
不。不幸的是,这并不容易。MDN 上 this
关键字的文档给出了一个很好的概述。当函数作为方法调用时,它被设置为对象,但还有其他可能性。默认情况下,当调用this
时,undefined
没有任何特殊功能,就像您对 func1
和 func2
所做的那样。对于草率(非严格(模式函数undefined
(和null
(不使用,在这种情况下,this
确实指向它们的全局对象(window
在浏览器中( - 您正在观察的内容。
但是,当函数作为构造函数调用(使用 new
关键字(时,它也可以指向新的对象实例,或者在用作处理程序时指向事件目标(如 DOM 元素(。最后但并非最不重要的一点是,它可以手动设置 call
, apply
或 bind
...
this
与嵌套无关。嵌套函数声明/表达式仅影响变量的范围("隐私",可用性(。虽然函数的变量范围永远不会改变,但每次调用时this
的值可能会不同 - 它更像是一个额外的参数。
> 函数中 this
关键字的含义取决于调用函数的方式。JavaScript 中有 4 种不同的函数调用模式。
- 函数调用模式
foo()
- 方法调用模式
o.foo()
- 构造函数调用模式
new foo
- 调用/应用模式
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
的好文章。
- JavaScript 中的嵌套函数和 “this” 关键字
- Javascript 对象和 this 关键字
- 将“this”关键字发送到对象中
- 如何使用“this”关键字来调用a
- 组合类和事件监听器:`this`关键字
- 将this关键字与selectedIndex一起使用的优势
- 在forEach中调用类函数:Javascript如何处理“this”关键字
- 使用“this”关键字响应类行为
- Javascript 'this' 关键字 在嵌套函数中
- 事件处理函数不适用于“this”关键字
- (无效)如何在 JSON 中使用“this”关键字
- JavaScript Promise 和 this 关键字
- 如何在 html 中使用“this”关键字在对象上调用方法
- Javascript中“this”关键字的目的是什么?
- 处理 jQuery 事件时在 JavaScript 类中覆盖的 'this' 关键字
- PHP 相当于 JavaScript “this” 关键字,特别是在对象中
- 嵌套函数中“this”关键字的范围
- 在我的命名空间JavaScript中使用this关键字
- JavaScript 中的 'this' 关键字
- Javascript [this] 关键字绑定与 new