《JavaScript總結》apply、call和bind方法

在JavaScript中,apply、call、bind這個三個方法,它們的做用都是爲了改變某個函數運行時的上下文,html

也就是改變函數體內的this指向。數組

在一個函數裏,存在「定義時上下文」、「運行時上下文」,並且上下文是能夠改變的。app

apply方法函數

apply方法接收兩個參數,第一個參數是:「上下文對象」 ,第二個參數是:「傳入當前執行函數的參數」(第二個參數是數組)。測試

 

        function test(){
            console.log(this.name);
        }
        
        let one = {
            name:'測試1'
        }

        let two = {
            name:'測試2'
        }

        test.apply(one);//將one對象傳入函數 這時test函數的上下文是one ,one的name等於'測試1' 因此輸出 '測試1'
        test.apply(two);//將two對象傳入函數 這時test函數的上下文是two ,two的name等於'測試2' 因此輸出 '測試2'    

 

咱們本身封裝一個log函數,將傳入的參數打印在控制檯。this

        function log(){
            var arr = Array.prototype.slice.apply(arguments);
            console.log.apply(console,arr);
        }

        log(1,2,4);    

 

call方法spa

call和apply做用都是同樣的,惟一的不一樣點是第二個參數,apply的第二個參數是數組,而call的第二個參數的話,看下面例子:prototype

        var arr = [1,2,3];
        Array.prototype.push.call(arr,6,7,8); //參數是一個一個傳的
        console.log(arr);//[1, 2, 3, 6, 7, 8]

 

bind方法code

 bind方法和apply、call的做用也是差很少的,不一樣的是 apply、call 這兩個方法是當即執行函數,而bind不是,來看下面例子:htm

        let one = {
            name:'測試1'
        }
        let two = {
            name:'測試2'
        }

        function sayName(){
            console.log(this.name);
        }

        let play = sayName.bind(one); //這裏並不會當即執行
        play(); //因此 能夠將這個方法 放到須要的地方 在執行

 

apply、call、bind這三者的區別

相同點:這個三個方法的做用都是改變函數執行上下文。

不一樣點:bind是返回對應的函數,便於稍後調用,apply、call方法則是當即執行(當即調用)

 

參考教程:https://www.cnblogs.com/moqiutao/p/7371988.html

相關文章
相關標籤/搜索