在Javascript中将函数应用于Null

Faw*_*es5 7 javascript call

为什么以下工作:

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.callcontext,它定义this了被调用函数的执行上下文的值,没有别的.

所以基本上,你说这this是指null(至少在ES5严格模式下),但是因为你this无论如何都没有访问,所以没有区别.

在非严格模式下,this不能null,所以它被替换为全局对象.

  • `this`不是[context](http://es5.github.com/#x10-toc),它是执行上下文的一个组件. (3认同)

Ry-*_*Ry- 12

当您使用.call.apply使用null或时undefined,默认情况下this(通常window)会自动使用,如果不是严格模式.

来自MDN(强调我的):

thisArg
this为呼叫提供 的值fun.请注意,这可能不是该方法看到的实际值:如果该方法是非严格模式代码中的函数,null并且undefined将被全局对象替换,并且原始值将被加框.

如果你在严格模式下,它实际上将是nullundefined.

(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)