我正在努力提高我的JavaScript技能,并且我知道调用函数有四种基本方法 - 它改变了this
的定义方式。我感兴趣的两个是基本的两个:
哪个好。第一个,this
将引用window
对象:
function doSomething() {
console.log(this);
}
doSomething(); // window is logged
第二个this
将引用它正在执行的对象:
var t = {
doSomething: function () {
console.log(this);
}
};
t.doSomething(); // t is logged
哪都好。但是,在这两个调用方法中,this
总是会返回包含方法的对象(如果有意义的话),这是正确的吗?
在第一个示例中,doSomething()
实际上是在window
对象中定义的 - 所以window
对象的属性也是如此,即使我们没有定义它(或者参考它。)
因此,难道不能说,实际上,作为一个函数的调用是一种调用方法吗?或者不是?
答案 0 :(得分:0)
想象一下定义你的函数,不是像你那样在全局对象的范围内,而是在另一个函数的范围内:
function outer() {
var inner = function(){console.log(this)};
inner();
};
outer();
您认为这个将被绑定到什么地方?会打印什么?
您可能认为它将是外部函数对象,但事实证明它始终是全局对象。
就像你写的那样:
function outer() {
var inner = function(){console.log(this)};
inner.call(window);
};
outer();
这是一个非常危险且远非直观的JS“功能”。
所以,回到你的第一个例子,你所做的基本上是这样的:
doSomething = function () {
console.log(this);
}
doSomething().call(window);
而且,就像Yoshi指出的那样,如果你使用ES5的严格模式,你最终会做出类似的事情,在我看来,这样做的危险性要小得多:
doSomething的()调用(未定义);
它还为您提供了一个强烈暗示,即您不应该在函数中使用 this 这一事实;)