为什么以下工作:
function sum(a,b) { return a + b; }
var result = sum.call(null,3,4); // 7
为什么要定义结果?我正在调用sum作为null的方法。但是null不是一个对象,不能有属性!
发生了什么事?
答案 0 :(得分:17)
Function.prototype.call
的第一个参数是 context ,它定义了被调用函数的执行上下文的this
值,没有别的。
所以基本上,你说this
指的是null
(至少在ES5严格模式下),但是因为你无论如何都不访问this
,没有区别。
在非严格模式下,this
不能为null
,因此会替换为全局对象。
答案 1 :(得分:12)
当.call
或.apply
与null
或undefined
一起使用时,默认this
(通常为window
)会自动使用不是严格的模式。
来自MDN(强调我的):
thisArg
this
的值为fun
的调用提供了。请注意,这可能不是方法看到的实际值:如果方法是非严格模式代码中的函数,则null
和undefined
将替换为全局对象,原始值将被加框。
如果 处于严格模式,它实际上将是null
或undefined
。
(function() {
'use strict';
return this;
}).call(null); // null
(function() {
'use strict';
return this;
})(); // undefined
答案 2 :(得分:4)
不是。在这种情况下,NULL指定this
关键字绑定到的对象。在您的方法中,通过将其设置为NULL,它将不具有this
变量绑定,或者它将绑定到函数本身或窗口。
由于您没有使用通过this
访问的任何变量或函数,因此无需使用调用方法......您只需使用sum(3,4)
答案 3 :(得分:1)
如上所述,MDN,第一个参数是
为[方法]的调用提供的值。注意 这可能不是方法看到的实际值:如果方法是 非严格模式代码中的函数,null和undefined将是 替换为全局对象,原始值将被加框。
答案 4 :(得分:0)
正如MDN解释的那样。
thisArg
为乐趣召唤提供的价值。请注意,这可能不是 是方法看到的实际值:如果方法是函数 在非严格模式代码中,null和undefined将替换为 全局对象和原始值将被装箱。
简单地用一点代码。
<script >
'use strict'
function fun() {
alert(this);
}
fun.call(null);
</script>
在严格模式下,这是null。但在不严格的模式。这是窗口或全局对象。