改變this指向的call,apply,bind

call apply bind

在JS中,這三者都是用來改變函數的this對象的指向的,他們有什麼樣的區別呢。 在說區別以前仍是先總結一下三者的類似之處:數組

一、都是用來改變函數的this對象的指向的。bash

二、第一個參數都是this要指向的對象。app

三、均可以利用後續參數傳參。函數

因爲都是對函數做用的屬性,因此封裝方法時都是放在了Function的原型上。

call

call可讓函數執行,而且能夠改變函數執行時內部的this指向,this指向了call的第一個實參,call後邊的全部參數都被做爲實參傳給了前邊到的函數。ui

call的封裝方法:myCall

Function.prototype.myCall = function myCall(context, ...arg) {
        context = context || window;
        let a = Symbol();
        context[a] = this;
        let res = context[a](...arg);
        delete context[a];
        return res;
    }
複製代碼

apply

apply功能相似於call,可是第二個參數是個數組或者類數組的集合,雖然是以一個集合的形式傳過去的,可是接收時仍是散亂的接收的。this

apply的封裝方法:myApply

Function.prototype.myApply = function myApply(context, arg) {
        arg = arg || [];
        context = context || window;
        let a = Symbol();
        context[a] = this;
        let res = context[a](...arg);
        delete context[a];
        return res;
    }
複製代碼

bind

bind用法跟call同樣,bind返回值是一個新函數,新函數執行時fn纔會執行,fn中的this這時纔會被改爲新的指向。spa

bind的封裝方法:myBind

Function.prototype.myBind = function (context, ...arg) {
        var _this = this;
        return function (...ary) {
            return _this.apply(context, arg.concat(ary))
        }
    }
複製代碼
相關文章
相關標籤/搜索