js函數的間接調用call()、apply()和bind()

1、首先JavaScript函數有五種調用方式

1. 函數正常調用javascript

2. 做爲對象方法(把這個函數寫進對象屬性中充當一個方法來用)java

3. 經過new做爲構造函數使用數組

4. 間接調用:call()、apply()和bind();瀏覽器

5. 自調用(function(){})();或者(function(){}());app

2、而後咱們瞭解下五種方式一般會用在什麼場景環境下:

1. 函數正常調用通常是爲了快速寫一個功能模塊並保護做用域的時候經常使用。函數

2. 對象方法:毋庸置疑是一個封裝的面相對象的思惟this

3. new做爲構造函數是建立一個對象的方法之一spa

4. 自調用通常用於快速執行或者插件初始化。prototype

5.至於call()、apply()和bind()呢?帶着這個疑問咱們去探討一下:插件

1). 使用call和apply的第一個參數必須是一個對象
2). call第二個參數以後是一些列參數而apply必須是把這些參數組成一個數組傳入。                                  3). bind方法只傳入一個對象,把這個函數綁定在這個對象上!並返回一個新的函數!調用新的函數並傳入參數,這個過程當作這個對象的這個方法來操做,而實參所有傳入原函數。

 

var name = "張三";
    var obj = {name:"李四"};
    function myFunction(arg1,arg2) {
        console.log("\n"+this.name);
        console.log("\n"+arg1);
        console.log("\n"+arg2);
    }
    myFunction("我是參數1","我是參數2");  //張三
    myFunction.call(window,"我是參數1","我也是參數"); //張三

    //1 call方法
    myFunction.call(obj,"我也是參數1","我也是參數2"); //李四
    //apply方法
    myFunction.apply(obj,["我也是參數1","我也是參數2"]); //李四
    //bind方法
    var bindNewFun = myFunction.bind(obj);
    bindNewFun("我是bind參數1","我是bind參數2"); //李四

首先函數內部的this指向調用當前函數的對象,正常的函數調用f(x);===window.f(x);因此f(x)裏的this指的是window。通常使用call、apply和bind函數傳入一個新的對象,改變函數內部的this指向(從全局window轉到傳入的對象!),經過call、apply和bind傳入的對象,在函數內部被this指向,就能訪問這個對象了。否則直接調用函數的話,this會指向全局對象window。

3、call()、apply()和bind()三個函數從何而來?

 1. 首選咱們知道每一個函數其實也是一個對象,既然是對象,那它就應該會有本身的屬性和方法。就比如如每一個函數建立時JavaScript都會給它自動建立一個屬性property和方法toString()同樣!固然也就還有咱們的call()、apply()和bind()方法啦...

2. 實際來源:每一個函數的原型是Function.prototype。因此這些方法是從函數原型來的!

    Function.prototype.call()

    Function.prototype.apply()

    Function.prototype.bind()

console.log(Function.prototype.hasOwnProperty('bind')) //true
console.log(Function.prototype.hasOwnProperty('call')) //true
console.log(Function.prototype.hasOwnProperty('apply')) //true

4、關於上下文context

0. context是函數中this的指向

1. 每一個js函數都有與之對應的上下文,由於每當調用一個函數時,一個新的執行上下文就會被建立出來。而且將其壓入到執行上下文堆棧的頂部。瀏覽器老是執行當前在堆棧頂部的上下文,一旦執行完畢,該上下文就會從堆棧頂部被彈出,而後,進入其下的上下文執行代碼。

2. 能夠經過call和apply和bind三個函數改變函數的上下文。

3. context代表當前函數被誰調用!

4. 上下文一般是取決於一個函數如何被調用

        A. 當函數做爲對象的方法被調用時,this 被設置爲調用方法的對象

        B. 當調用一個函數時經過new的操做符建立一個對象的實例。當以這種方式調用時,this 的值將被設置爲新建立的實例

        C. 當調用一個未綁定函數,this 將被默認設置爲 全局上下文(global context) 或window對象(若是在瀏覽器中)

相關文章
相關標籤/搜索