JavaScript |这个标识符
在 JavaScript 中,“this”标识符可用于不同的上下文和范围。让我们逐一确定这是什么以及如何决定。
全球范围
每当在全局上下文中使用“this”关键字时,即不是作为函数或对象声明的成员,它总是引用全局对象。以下示例将说明此行为。
// Declaring variable in global context.
var a = "GFG";
console.log(a);
// Using this we refer to the Global Context.
// And update the value of a we declared previously.
this.a = "GeeksforGeeks";
console.log(a);
输出:
GFG
GeeksforGeeks
功能范围
如果函数内部有一个“this”引用,则可以说 this 引用的是一个对象,而不是函数本身(这通常是程序员最常犯的错误)。
要确定“this”指向哪个对象,首先取决于函数的调用方式。下面的例子将对这个案例有所了解。
// Function that contains this.
function myFunc() {
console.log( this.a );
}
var a = "Global";
// Owner of the function.
var myObj1 = {
a: "myObj1",
myFunc: myFunc
};
// Object other than the owner.
var myObj2 = {
a: "myObj2"
};
// Call the function in Global Scope.
myFunc();
// Call the function from the reference of owner.
myObj1.myFunc();
// Call the function from the reference
// of object other than the owner.
myFunc.call( myObj2 );
// Create a new undefined object.
new myFunc();
输出:
Global
myObj1
myObj2
undefined
看到上面的例子,我们可以看到四种不同的方法可以确定this指向什么。如何设置有四个规则,让我们自己解释这四个。
- 在第一次调用中, myFunc() 最终将this设置为非严格模式下的 Global 对象。然而,在严格模式下,这将是未定义的,并且 JavaScript 将在访问该属性时抛出错误。
- myObj1.myFunc() 将this设置为 myObj1 对象,这里 myObj1 是函数myFunc 的所有者,我们使用对象本身的引用调用函数,因此在这种情况下 this 将引用所有者对象。
- myFunc.call(myObj2)将此设置为 myObj2 对象。这证明了this并不总是指向所有者对象,而是指向函数在其范围内被调用的对象。
- new myFunc() 将此设置为一个全新的空对象,因此我们在控制台日志中未定义。
注意:我们可以通过遵循这个简单的技术来确定“this”指的是谁。每当调用包含“this”的函数时,我们应该查看括号对“()”的最左边。如果括号的左边有一个引用,那么“this”指的是它所属的对象,否则,它指的是全局对象。假设我们没有使用任何特殊的函数来调用函数。
在事件处理程序内部
事件处理程序中的“this”总是指它被触发的元素。让我们看一个例子来说明这一点。
Welcome to GFG!
function clickedMe() {
console.log(this.innerHTML);
}
clickedMe(); // undefined because global object.
var myElem = document.getElementById('clickMe');
myElem.onclick = clickedMe;
myElem.onclick(); // Welcome to GFG!
输出:
undefined
Welcome to GFG!
我们可以在这里看到第一次调用是在全局范围内进行的,因此“this”引用了全局对象,并且记录了 undefined。然后我们将该函数复制到 myElem.onclick 事件中,因此每当调用 onclick函数时,“this”指的是 myElem 元素,它是 id 为 clickMe 的 div,因此“欢迎来到 GFG!”被记录。
现在我们可以说我们知道它是如何被设置为一个特定的对象的,并且我们不必担心这样的误解。