20190115問:
Call,Apply,Bind的使用與區別,如何實現一個bind?
相同點:
- 都是使用於方法借用及明確this指向場景
- 第一個引數都是this要指向的物件
- 都可以利用後續引數傳參
不同點:
- 引數傳遞方式不同
- call,apply是立即呼叫,bind是動態呼叫
基本使用:
Array.prototype.slice.call(obj,0,1,2)
Array.prototype.slice.apply(obj,[0,1,2])
Array.prototype.slice.bind(obj)(0,1,2)
複製程式碼
從上面的例子可以看出來call,apply 使用上幾乎保持一致,而bind實際上是返回了一個函式
簡易bind實現
Function.prototype.bind = function(context){
const _this = this
return function() {
_this.apply(context, Array.prototype.slice.call(arguments))
}
}
複製程式碼
上面的bind只實現了方法的作用域繫結,引數已經固定,如果想要動態的引數我們得改寫一下
Function.prototype.bind = function(context){
const _this = this
const argus = Array.prototype.slice.apply(arguments,[1])
return function() {
_this.apply(context, argus.concat(Array.prototype.slice.call(arguments)))
}
}
複製程式碼
往期
JS每日一題: 說說你對前端模組化的理解
JS每日一題: web安全攻擊手段有哪些?以及如何防範
關於JS每日一題
JS每日一題可以看成是一個語音答題社群
每天利用碎片時間採用60秒內的語音形式來完成當天的考題
群主在次日0點推送當天的參考答案
- 注 絕不僅限於完成當天任務,更多是查漏補缺,學習群內其它同學優秀的答題思路