Javascript”;这个“;作用域根据调用方式给出不同的结果

Javascript "this" scope giving different result depending on the way it is called

本文关键字:结果 方式 这个 作用域 Javascript 调用      更新时间:2023-09-26

全部,

这是代码:

var Person = function (name) {
  this.name = name;
  this.printName = function(){
    console.log("My name is " + this.name);
  }
};

var p = new Person("Steve");
var funcRef = p["printName"];
p.printName();//Works
p["printName"]();//Works
funcRef();//returns incorrect value

在此处查找工作示例:http://plnkr.co/edit/57LS6oXPfqccAWf6uqQV?p=preview

我的问题是后两者之间有什么区别?我以相同的方式访问对象方法,唯一的区别是调用它的方式。

为什么会返回差异结果?

我第一次在javascript中看到这个。我知道它在一个不同的范围内,但我不知道它是如何与对象解耦的,这正是我想要理解的。

感谢

Steve

javascript在直接调用对象上的函数时绑定this关键字。

对于test.fn()this将是fn中的test。与test['fn']()相同。但如果执行var fn = test.fn; fn(),则this将是fn中的全局根(浏览器中的window)。

您可以在这样的函数中强制使用thisvar fn = test.fn.bind(test);

更多信息请点击此处:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this

案例1:"this"始终采用其所调用对象的上下文。

在p.printName()中,上下文是p,因此"this"引用"p"所指的Person对象。

情况2:但是,当您将"funcRef"指向p的方法时,它将丢失此上下文,"this"将引用全局对象。

全局对象可能会根据您的js环境(如浏览器上下文或节点等)而有所不同。

这就是为什么你会看到不同的结果。

正如其他答案所说,当您调用函数时,this是绑定的。保持对对象引用的一种常见方法是使用这样的东西:

var Person = function (name) {
  var self = this; // Keep a reference to this object for later use
  self.name = name;
  self.printName = function(){
    console.log("My name is " + self.name);
  }
};

以上答案已经解释了这个作用域的行为,这里是"this"用法的最佳实践,将"this"用作一个名为"self"的新变量,请参阅下面的代码,这样您就可以更好地控制这个作用域,并减少由于错误使用这个作用域而导致的错误。

var Person = function (name) {
  var self=this;
  self.name = name;
  self.printName = function(){
    console.log("My name is " + self.name);
  }
};