2016-07-21 118 views
1

当我执行下面的JavaScript片段...绑定使用null或未定义的一个JavaScript功能thisArg

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调用包装函数?我在网上没有发现任何关于这种行为的信息。

+1

当您添加 “用严格的”;在函数开始时,它的行为和预期的一样,所以默认情况下可以将null/undefined转换为窗口,除非严格模式在播放? – sielakos

+0

是的,如果绑定为null或未定义,则表示全局上下文 – cstuncsik

回答

2

试图将非对象用作上下文很可能存在一些问题。尝试使用原语(fn.call(1))实际上会“框出”该值,将该原语转换为用作上下文的对象。

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

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

[MDN]

+0

正如其他人指出的(并且也在MDN页面上),这不会在严格模式下发生。奇怪的是,尽管绝大多数时候严格模式都会给你戴上手套,但在这种情况下,它相信你知道你在做什么! ,P – Whothehellisthat