子功能中的Javascript新关键字

时间:2014-11-11 08:59:42

标签: javascript

我试图弄清楚'new'关键字在Javascript中是如何工作的。但它有一个奇怪的行为。
当我在节点中运行此代码时:

var testing = function() {
  self = this;
  this.abc = 'abc';
  console.log(this); // ====> 1

  var subMethod = function () {
    console.log(this);  // =====> 2
    console.log(self === this); // ====> 3
  };
  //subMethod.apply(this);
  subMethod();
};


test = new testing();
// test = testing(); // ===> *4

console.log(self === this)给了我假。 nr 1中的'this'是{abc:'abc'},而sub方法中的'this'是全局'this'对象。任何人都可以给我这个行为的解释吗?
如果我使用subMethod.apply(this)运行,那么console.log(self === this)为true({abc:'abc'})

当我在没有新关键字(* 4)的情况下运行时,'this'变量与全局'this'(如预期)相同,还有console.log(self === this ) 是真的。     

当使用'new'关键字运行时,为什么子方法中的'this'与全局'this'相同。

1 个答案:

答案 0 :(得分:1)

当您致电new testing()时,函数testing将以其上下文(this)作为新对象运行。第一个日志将是该对象。在内部,当您运行subMethod()时,它将在全局上下文中运行。这就是JS如何做到的。因此,thiswindowself !== this。如果您使用this上下文(subMethod.apply(this))调用它,那么自然self === this

当你致电testing()时,它会在全球范围内运行。当您添加abc时,它现在是全局的,因为thiswindow。当您调用subMethod()时,默认情况下也会在全局上下文中调用它,因此self === this

基本上,运行普通函数是在全局上下文中。将函数作为构造函数运行(使用new)会创建新的上下文。在基础对象的上下文中调用运行方法(例如"abaca".split('a')) - 使用split作为"abaca"调用this

这有帮助吗?