为什么以下工作:
function sum(a,b) { return a + b; }
var result = sum.call(null,3,4); // 7
Run Code Online (Sandbox Code Playgroud)
为什么定义结果?我正在调用sum作为null的方法.但是null不是一个对象,不能拥有属性!
到底是怎么回事?
jAn*_*ndy 17
第一个参数Function.prototype.call是context,它定义this了被调用函数的执行上下文的值,没有别的.
所以基本上,你说这this是指null(至少在ES5严格模式下),但是因为你this无论如何都没有访问,所以没有区别.
在非严格模式下,this不能null,所以它被替换为全局对象.
Ry-*_*Ry- 12
当您使用.call或.apply使用null或时undefined,默认情况下this(通常window)会自动使用,如果不是严格模式.
来自MDN(强调我的):
thisArgthis为呼叫提供 的值fun.请注意,这可能不是该方法看到的实际值:如果该方法是非严格模式代码中的函数,null并且undefined将被全局对象替换,并且原始值将被加框.
如果你是在严格模式下,它实际上将是null或undefined.
(function() {
'use strict';
return this;
}).call(null); // null
Run Code Online (Sandbox Code Playgroud)
(function() {
'use strict';
return this;
})(); // undefined
Run Code Online (Sandbox Code Playgroud)