我试图弄清楚'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'相同。
答案 0 :(得分:1)
当您致电new testing()
时,函数testing
将以其上下文(this
)作为新对象运行。第一个日志将是该对象。在内部,当您运行subMethod()
时,它将在全局上下文中运行。这就是JS如何做到的。因此,this
为window
和self !== this
。如果您使用this
上下文(subMethod.apply(this)
)调用它,那么自然self === this
。
当你致电testing()
时,它会在全球范围内运行。当您添加abc
时,它现在是全局的,因为this
是window
。当您调用subMethod()
时,默认情况下也会在全局上下文中调用它,因此self === this
。
基本上,运行普通函数是在全局上下文中。将函数作为构造函数运行(使用new
)会创建新的上下文。在基础对象的上下文中调用运行方法(例如"abaca".split('a')
) - 使用split
作为"abaca"
调用this
。
这有帮助吗?