JS每日一題: Call,Apply,Bind的使用與區別,如何實現一個bind?

JS每日一題發表於2019-01-23

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點推送當天的參考答案

  • 注 絕不僅限於完成當天任務,更多是查漏補缺,學習群內其它同學優秀的答題思路

掃描下方二維碼即可加入答題

JS每日一題: Call,Apply,Bind的使用與區別,如何實現一個bind?

相關文章