将 javascript 函数与 null 或 undefined 绑定为 thisArg

Binding a javascript function with null or undefined as thisArg

当我执行以下 javascript 片段时 ...

function addAndThis(n1, n2) {
  console.log("THIS:" + this + " SUM:" + (n1+n2));
}

var boundNullThisAddAndThis = addAndThis.bind(null);
var boundUndefinedThisddAndThis = addAndThis.bind(undefined);
var boundStringThisAddAndThis = addAndThis.bind("TEST");

addAndThis(10, 20);
boundNullThisAddAndThis(100, 200);
boundUndefinedThisddAndThis(1000, 2000);
boundStringThisAddAndThis(10000, 20000);

...我得到这个输出:

THIS:[object Window] SUM:30
THIS:[object Window] SUM:300
THIS:[object Window] SUM:3000
THIS:TEST SUM:30000

输出的第一行和最后一行符合我的预期。但是为什么 Function.prototype.bind 创建的绑定函数不调用带有 null 或 undefined 的包装函数?我在网上没有找到任何有关此行为的信息。

很可能是尝试使用非对象作为上下文时出现了一些问题。尝试使用原语 (fn.call(1)) 实际上 "boxes" 值,将原语变成对象以用作上下文。

.call() .apply().bind() 函数都采用 "nully" 值并使用默认的 window 对象。

正如其他人所指出的(也在 MDN 页面上),这在严格模式下不会发生。奇怪的是,虽然大多数时候严格模式会给你戴上小手套,但在这种情况下,它相信你知道自己在做什么! ;P

[MDN]