当我执行以下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调用包装函数?我没有在网上找到任何有关此行为的信息。
答案 0 :(得分:2)
尝试将非对象用作上下文时,最有可能出现问题。试图使用原语(fn.call(1)
)实际上#34;框"值,将原语转换为对象以用作上下文。
.call()
.apply()
和.bind()
功能全部采用" nully"值并使用默认的window
对象。
正如其他人所指出的那样(并且也在MDN页面上),这在严格模式下不会发生。奇怪的是,虽然大部分时间严格的模式都会给你戴上手套,但在这种情况下,它相信你知道你在做什么! ; P
[MDN]