📜  JavaScript |这个标识符

📅  最后修改于: 2022-05-13 01:58:10.510000             🧑  作者: Mango

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!”被记录。

现在我们可以说我们知道是如何被设置为一个特定的对象的,并且我们不必担心这样的误解。