繁体   English   中英

为什么在调用apply()或call()时,“ this”指向函数内部的窗口?

[英]Why 'this' points to window inside a function when apply() or call() is being called?

我正在阅读Nicholas Z.Zakas针对Web开发人员第三版的专业JavaScript,在“引用类型”一章中,我对函数类型部分有些困惑。

function sum(num1, num2){
return num1 + num2;
}

function callSum1(num1, num2){
return sum.apply(this, arguments);
}

alert(callSum1(10,10)); //20

他说:

“在此示例中, callSum1()执行sum()方法,将this作为this值传入(由于在全局范围内被调用,因此等于window ),并且还传入arguments对象。”

我明白他说什么,但不明白为什么。 This应该指向功能不是吗? 现在我很困惑它指向窗口,因为它是在全局范围内被调用的。

有人可以向我解释吗? :)

我不确定是否会或以后必须使用此技术,但是我想确保自己了解它,尤其是这一部分。 有关this及其用法的更多详细信息将在“ OOP”部分中,但现在这是一个有趣的问题。

提前致谢!

this取决于你如何调用一个函数。

如果您在使用调用一个函数callapply则价值this将是第一个参数传递给函数。

在这里,您有sum.apply(this, arguments); 因此它将通过当前值。 通常,该值由调用函数的方式确定。

由于您在没有上下文的情况下调用callSum1(10,10)this它将是window

(如果处于严格模式下,它将是undefined 。如果您不在浏览器中,那么它将与您所使用的JS环境的默认对象无关)。

这里:

alert(callSum1(10,10)); //20

......你打电话callSum没有做任何事情来设置this在通话过程中,因此this被默认为全局对象( window ,在浏览器上)。 (在宽松模式下;在严格模式下, this将是undefined 。)

从那时起,你使用apply ,并通过同this到它:

return sum.apply(this, arguments);

...自然地,在调用sum时也会使用全局对象。

我明白他说什么,但不明白为什么。 这应该指向功能不是吗?

不, this几乎从不涉及功能。 (当然,它很少会这样做。)

现在我很困惑它指向窗口,因为它是在全局范围内被调用的。

这不是因为它在全局范围内被调用。 如果从函数内部调用它,将是相同的。 重要的不是呼叫发生在哪里 ,而是如何发生。 你调用一个函数没有做任何事情任何时候设置this ,在宽松的模式, this在函数调用期间将是全局对象。 它不必处于全球范围内; 重要的是如何调用该函数。

该规则实际上是一个简单了很多比人做出来是:如果你调用一个函数没有做任何事情来设置this ,在通话过程中, this将是全球对象(松散模式)或undefined (严格模式)。 以下是你可以做把东西this函数调用时:

  1. 调用函数作为表达式的一部分,从对象的属性获取函数。 例如foo.bar(); foobar属性中检索对该函数的引用,然后调用bar 因为我们是这样做的,所以在调用bar期间, this指的是foo

  2. 通过调用函数.call.apply ; this就是您在第一个参数中传递的内容。 (在松散模式,如果传递undefinednull ,或非对象在第一个参数,在通话过程中this将是全局对象。在严格的模式,这将是你传递什么。)

  3. 调用绑定函数。 这是通过Function#bind (ES5功能)创建的Function#bind 绑定函数将this “嵌入”到它们中。

更多(在我的博客上)

下的窗口对象部分20〜页之后,我读这样的:“如前面所提到的, this值相当于当一个函数与没有明确的执行全局对象this或者通过作为一个对象的方法,或通过指定的值( call() / apply() ”。 :)

也许我以前没听懂,但现在他的话也很清楚。 顺便说一下,这本书太棒了! 现在,通过Math对象,我也可以了解更多apply()方法。

var values = [1,2,3,4,5,6];
var max = Math.max.apply(Math, values);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM