将 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]
当我执行以下 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]