![](/img/trans.png)
[英]Why is google chart function not being called when it's inside a function?
[英]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
取决于你如何调用一个函数。
如果您在使用调用一个函数call
或apply
则价值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
函数调用时:
调用函数作为表达式的一部分,从对象的属性获取函数。 例如foo.bar();
从foo
的bar
属性中检索对该函数的引用,然后调用bar
。 因为我们是这样做的,所以在调用bar
期间, this
指的是foo
。
通过调用函数.call
或.apply
; this
就是您在第一个参数中传递的内容。 (在松散模式,如果传递undefined
, null
,或非对象在第一个参数,在通话过程中this
将是全局对象。在严格的模式,这将是你传递什么。)
调用绑定函数。 这是通过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.