1. 程式人生 > >匿名函式的this指向

匿名函式的this指向

匿名函式

在函式表示式中,建立一個函式並將它賦值給一個變數,若此時function關鍵字後沒有識別符號,那麼建立的函式可稱為匿名函式

匿名函式中的this指向

在一般情況下,this物件是在執行時基於函式的執行環境繫結的。若是在全域性函式中,則this指向window;當函式被作為某個物件的方法呼叫時,this指向該物件。但是在匿名函式中,因為匿名函式的執行環境具有全域性性,所以它的this一般指向window。

var name = "The Window";
  var object = {
    name : "My Object",
    //var that=this; //可以更改this指向,使之指向當前的object物件
    getNameFunc : function(){
      return function(){
        return this.name;
      };
    }
  };
  alert(object.getNameFunc()());  // 輸出為  The Window“”

上面的程式碼中,getNameFunc()函式中返回的是匿名函式,匿名函式中的this指向的是window,因此輸出的是全域性變數the window。
為什麼?因為object.getNameFunc()()可以拆解如下

var  f = object.getNameFunc(); //返回的是一個匿名函式;
     f(); //相當於呼叫了該匿名函式,此時的呼叫者是window物件。所以this會指向window

如果想要匿名函式的this能夠執行當前的object物件,那麼就要更改this。可以在匿名函式外新增一行:var that=this----即更改this的指向,更改this的指向還可以用call、apply、bind,輸出程式碼改為下面這行即可將this指向更改指向object物件。call、apply、bind是有區別的,共同點是可以改變執行環境上下文且第一個引數都是指定的物件,不同點:1.apply的第二個引數是陣列,這一點和call和bind不一樣,call和bind可以傳遞多個引數。2.bind()返回了改變了執行上下文環境的函式但是不會立即執行該函式,而call()和apply()會直接執行該函式。

alert(object.getNameFunc().call(object));  //輸出 “my object”
alert(object.getNameFunc().apply(object));  

  利用bind方法,bind(object)()

alert(object.getNameFunc().bind(object)());  

事例如下:
下述為一個匿名自執行函式,誠如所知,函式名實際上只是一個指向函式物件的指標,對於匿名函式而言,沒有函式名。將匿名函式用一對圓括號包含表示是一個函式表示式(如:(function() {}),而後面的 () 表示呼叫

var a=2;
(function() {
     var a=3;
     return this.a;
})()       //輸出為 2,this指向的是window