规则总有例外,这里也一样。如果你把 null 或者 undefined 作为 this 的绑定对象传入 call、apply 或者 bind,应用的是默认绑定规则
function foo(){ console.log(this.a); } var a = 2; foo.call(null); // 2
什么情况会传入 null 呢?
function foo(a,b){ console.log("a:" + a + ", b:" + b); } // 把数组 “展开” 成参数 foo.apply(null, [2,3]); // 使用 bind() 进行柯里化 (预先设置一些参数) var bar = foo.bind(null, 2); bar(3);
如果函数不关心 this 的话,你仍然需要传入一个占位值,这时 null 啃呢个是一个不错的选择,如果某个函数确实使用了 this,默认规则把 this 绑定到全局对象,这将导致不可预计的后果,比如修改全局对象。
function foo(a,b){ console.log("a:" + a + ", b:" + b); } // 我们的 DMZ 对象 var ø = Object.create(null); // 把数组 “展开” 成参数 foo.apply(ø, [2,3]); // 使用 bind() 进行柯里化 (预先设置一些参数) var bar = foo.bind(ø, 2); bar(3);
使用变量名不仅让函数变得更加“安全”,而且可以提高代码的可读性,因为 ø 表示 “我希望 this 是空”,这比 null 的含义更清楚