Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript";这";作用域根据其调用方式给出不同的结果_Javascript_Scope_This - Fatal编程技术网

Javascript";这";作用域根据其调用方式给出不同的结果

Javascript";这";作用域根据其调用方式给出不同的结果,javascript,scope,this,Javascript,Scope,This,全部, 代码如下: 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"]();/

全部,

代码如下:

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
在此处找到一个工作示例:

我的问题是最后两个之间有什么区别?我以同样的方式访问object方法,唯一的区别是调用它的方式

为什么它会返回一个不同的结果

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

谢谢


当您直接调用对象上的函数时,Steve

javascript会绑定
this
关键字

使用
test.fn()
这将是
test
内部
fn
。与
测试['fn']()相同。
。但是如果您执行
var fn=test.fn;fn()
将是
fn
内的全局根(
浏览器中的窗口

您可以在如下函数中强制执行
this
var fn=test.fn.bind(test)

更多信息请参见:

案例1: “this”始终获取其所调用对象的上下文

在p.printName()中,上下文是p,因此“this”引用了“p”引用的Person对象

案例2: 但是,当您将“funcRef”指向p的方法时,它将丢失此上下文,“this”将引用全局对象

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


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

正如另一个答案所说,
这个
在调用函数时是绑定的。保持对对象的引用的常用方法是使用以下内容:

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);
  }
};

这个
在JS中是后期绑定的。