Javascript"this"范围根据调用的方式给出不同的结果

Ste*_*tes 6 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"]();//Works
funcRef();//returns incorrect value
Run Code Online (Sandbox Code Playgroud)

在这里找到一个有用的例子:http://plnkr.co/edit/57LS6oXPfqccAWf6uqQV?p = preview

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

为什么会返回差异结果?

我第一次在javascript中遇到过这个问题.我知道这是在一个不同的范围,但我不知道它是如何与我想要了解的对象分离.

谢谢

史蒂夫

Mag*_*gus 5

this当你直接在对象上调用函数时,javascript绑定关键字.

随着test.fn(),this将在test里面fn.与...相同test['fn']().但如果你这样做var fn = test.fn; fn(),this将成为全局根(window在浏览器中)fn.

你可以强制this内部这样的函数:var fn = test.fn.bind(test);

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