你不知道的JS系列 ( 24 ) - 被忽略的 this

规则总有例外,这里也一样。如果你把 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 的含义更清楚

 

posted @ 2020-03-09 06:39  wzndkj  阅读(105)  评论(0编辑  收藏  举报