Call、apply、bind的區別

Call、apply、bind的區別

基礎

var obj = {
            name: '小明',
            gender:"男",
            age: 18,
            say() {
                console.log(this.name+","+this.gender+"今年"+this.age)
            }
        }
        obj.say()//小明,男今年18
        var xh ={
            name:"小紅",
            gender:"女",
            age:18
        }
        obj.say.call(xh)//小紅,女今年18
		obj.say.apply(xh)//小紅,女今年18
		obj.say.bind(xh)()//小紅,女今年18

傳參

<script>
        var obj = {
            name: '小明',
            gender: "男",
            age: 18,
            say(shool, Grade) {
                console.log(this.name + "," + this.gender + "今年" + this.age + "在" + shool + "上" + Grade)
            }
        }
        var xh = {
            name: "小紅",
            gender: "女",
            age: 18
        }
        obj.say.call(xh, "高等中學", "九年級")//小紅,女今年18在高等中學上九年級
        obj.say.apply(xh, ["高等中學", "九年級"])//小紅,女今年18在高等中學上九年級
        obj.say.bind(xh)("高等中學", "七年級")//小紅,女今年18在高等中學上七年級
        obj.say.bind(xh, "高等中學", "九年級")()//小紅,女今年18在高等中學上九年級
    </script>

總結

  • 相同點
    • 他們三者都是改變this的指向
    • 第一個參數都是this要指向的對象
    • 均可之後續傳參
  • 不一樣點
    • call和apply都是對函數直接調用,bind方法返回的是一個函數須要()調用
    • call傳遞參數的時候是字符串對應傳參,如:obj.say.call(xh, "高等中學", "九年級")
    • apply第二個參數是一個數組,如:obj.say.apply(xh, ["高等中學", "九年級"])
    • bind能夠在調用處傳參,如:obj.say.bind(xh)("高等中學", "七年級")
    • bind還能夠向call同樣傳參,如:obj.say.bind(xh, "高等中學", "九年級")()
相關文章
相關標籤/搜索