电子书上截图的obj : this后面是不是少个“,” 还有其中这段代码不太理解
return fn.apply(
(!this || this === (window || global)) ? obj : this,curried.concat.apply(curried, arguments));
电子书上截图的obj : this后面是不是少个“,” 还有其中这段代码不太理解
return fn.apply(
(!this || this === (window || global)) ? obj : this,curried.concat.apply(curried, arguments));
10 回答11.3k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
非常好的问题!
那里的确少了个逗号
要想知道那句代码说什么,得明白
softBind
是干嘛的。softBind
是相对原生bind
而言一个更灵活的绑定this
的功能。原生bind
有一个弊端:被绑定后的新函数无法再更改this
。如下面的例子所示:softBind
改进了bind
,使得对新函数的call
、apply
调用表现正常。那么,它是怎么区分这两种情况的呢?就是通过变量
this
的值。调用
funcA()
时,this
变量为全局对象(global
或window
),此时应该弃掉这个this
,将传入的obj
作用于func
上调用
funcA.call({a: 1})
时,this
为{a: 1}
,此时应该使用这个新的this
作为func
的this
这就是那句代码的逻辑:
(!this || this === (window || global)) ? obj : this
至于
curried.concat.apply(curried, arguments)
,这是为了合并两次传入的参数。这里的softBind
还有一个附带的功能,就是柯里化:允许你在softBind
时传入一部分参数,在实际调用时传入剩余的参数。那么实际调用时我们应该将两部分的参数合并在一起。然而arguments
不是真数组,无法通过curried.concat(arguments)
将其连接在一起,从而作者使用了一种迂回的写法。