美文网首页
JavaScript —关于“ this”关键字的全部

JavaScript —关于“ this”关键字的全部

作者: 魂斗驴 | 来源:发表于2021-02-09 16:12 被阅读0次

在本文中,我们将了解什么是JavaScript中的this关键字,this关键字的四种不同绑定以及“ new”关键字。

this 关键字是指一个对象,该对象正在执行javascript代码的当前位。
换句话说,每个javascript函数在执行时都会引用其当前执行上下文,称为this。执行上下文意味着这里是函数的调用方式。

要理解this关键字,只需要知道如何,何时何地从何处调用该函数,与如何声明和定义函数以及在何处定义无关紧要

function bike() {
  console.log(this.name);
}

var name = "Ninja";
var obj1 = { name: "Pulsar", bike: bike };
var obj2 = { name: "Gixxer", bike: bike };

bike();           // "Ninja"
obj1.bike();      // "Pulsar"
obj2.bike();      // "Gixxer"

在上面的代码片段中,bike()函数的工作是打印console.logthis.name这意味着它正在尝试打印name当前执行上下文(即this object)的property的值。

在上面的代码片段中,当函数bike()被调用时它会打印,“Ninja” 因为未指定执行上下文,因此默认情况下它是全局上下文,并且在全局上下文中存在一个变量name,其值为“Ninja”。
在情况下obj1().bike(),“Pulsar”被打印, 这背后的原因是函数bike()被调用执行上下文obj1, 这样this.name成了obj1.name。同样的,obj2.bike()这里的函数执行上下文bike()是obj2。

默认和隐式绑定this

  • 如果我们strict模式,则默认值this关键字undefined,否则this关键字充当全局对象,这就是所谓的默认绑定this关键字。(对于浏览器,默认为窗口对象)。
  • 当有一个对象属性作为方法被调用时,该对象成为该方法的this 对象或执行上下文对象,它是this关键字的隐式绑定。
var obj1 = {
  name: "Pulsar",
  bike: function() {
    console.log(this.name);
  }
}
var obj2 = { name: "Gixxer", bike: obj1.bike };
var name = "Ninja";
var bike = obj1.bike;

bike();           // "Ninja"
obj1.bike();      // "Pulsar"
obj2.bike();      // "Gixxer"

在上面的代码片段中,函数调用bike()是默认绑定的示例。obj1.bike()并且obj2.bike()是隐式绑定的示例。这里bike函数声明为的一部分obj1,但无论是当我们执行obj2.bike(),执行的背景下obj2使obj2.name被打印出来。

重要的是要知道如何,何时何地调用函数与声明函数的位置无关。

“ this”关键字的显式和固定绑定

如果我们在调用函数中使用call和apply方法,则这两个方法均将其第一个参数作为执行上下文。那具有this约束力。

function bike() {
  console.log(this.name);
}

var name = "Ninja";
var obj = { name: "Pulsar" }

bike();           // "Ninja"
bike.call(obj);   // "Pulsar"

在该上述代码段中,如果我们调用函数bike与call()方法通过执行上下文对象obj作为第一个参数,然后obj被分配到this对象,并将其打印“Pulsar”这只不过是obj.name。这称为this关键字的显式绑定。

  • 在固定绑定或硬绑定中,this无论从何处以及如何调用它,我们都可以强制对象始终相同。
var bike = function() {
  console.log(this.name);
}
var name = "Ninja";
var obj1 = { name: "Pulsar" };
var obj2 = { name: "Gixxer" };

var originalBikeFun = bike;
bike = function() {
  originalBikeFun.call(obj1);
};

bike();           // "Pulsar"
bike.call(obj2);  // "Pulsar"

按照上面的代码片段,bike()并bike.call(obj2)能打印"Pulsar"这无非是obj1.name指函数的执行上下文bike总是OBJ1和其因为originalBikeFun.call(obj1); 这些种类的this结合是明确的结合称为固定的结合只是另一种味道。

JavaScript中的“ new”关键字

任何函数前面的new关键字都会将函数调用转换为构造函数调用,并且在new关键字放在函数前面时会发生以下情况

  • 创建了一个全新的空对象
  • 新的空对象链接到该函数的原型属性
  • 相同的新空对象被绑定为函数调用执行上下文的this
  • 如果该函数不返回任何内容,则它隐式返回this对象。
function bike() {
  var name = "Ninja";
  this.maker = "Kawasaki";
  console.log(this.name + " " + maker);  // undefined Bajaj
}

var name = "Pulsar";
var maker = "Bajaj";

obj = new bike();
console.log(obj.maker);                  // "Kawasaki"

在上面的代码片段中,bike函数new在其前面用关键字调用。因此,它将创建一个新对象,然后将新对象链接到函数原型链bike,然后将创建的新对象绑定到this对象,然后函数返回this对象。这就是将返回的this对象分配给objand console.log(obj.maker)打印“Kawasaki”。

在上面的代码片段,this.name里面的功能bike()不打印“Ninja”或“Pulsar”代替它打印undefined,因为name变量的函数内声明bike()和this.name 是完全两个不同的东西。内部函数相同this.maker而maker不同bike()。

this关键字绑定的优先级

  • 首先,它检查是否使用new关键字调用该函数。
  • 其次,它检查函数是使用call()调用还是apply()方法表示显式绑定。
  • 第三,它检查该函数是否通过上下文对象调用(隐式绑定)。
  • 默认全局对象(在严格模式下未定义)。

参考

JavaScript — all about “this” keyword

相关文章

网友评论

      本文标题:JavaScript —关于“ this”关键字的全部

      本文链接:https://www.haomeiwen.com/subject/hgdotltx.html