閉包和this 完全理解js中this的指向,沒必要硬背。

function create(){
        var result =new Array();
        for(var i=0;i<10;i++){
            result[i]=function(){
                return i;
            }
        }
        return result;
    }

網上不少講解,可是看完之後老是似懂非懂,今天又看了一遍高程,說說本身的見解。html

最後輸出數組會獲得數組

 result=[10,10,10,10,10,10,10,10,10,10];

與想獲得的結果閉包

 result=[0,1,2,3,4,5,6,7,8,9]

相差甚遠,說一下緣由:函數

create函數內部的閉包能夠經過做用域訪問到外部函數create中的變量i,當函數create執行完之後i最後的值是10。post

而當console.log(result)數組的時候 本質上是打印this

result=[function(){return i;},function(){return i;},.....function(){return i;}]

數組中十個匿名函數的結果,由於是引用類型,只能訪問到create執行之後i的值。所以是10;url

 


 

解決方法仍是不少的spa

書上的方法code

 function create(){
        var result =new Array();
        for(var i=0;i<10;i++){
            result[i]=function(mun){
                return function(){
                    return mun;
                }
            }(i);
        }
        return result;
    }

能夠返回預期值,而後我又嘗試了一下htm

function xh(){
        let sz=[];
        for(var i=0;i<10;i++){
            sz[i]=function(i){
                return i;
            }(i);
        }
        return sz;
    }

本質上的區別仍是數組中保存了匿名函數\數值;

稍經嘗試就能夠得出結果。

固然少不了let 聲明變量i的方法。

 


 

關於this對象

有關於this的講解,追夢子大大講的很詳細,這裏貼出連接:完全理解js中this的指向,沒必要硬背。

這裏說一下高程中的例子

  var name='window';
    let obj={
        name:'obj',
        get:function(){
             return function (){
                return this.name;
            }
        }
    };
    alert(obj.get()());//window

而後貼出書中的講解:

前面曾經提到過,每一個函數在被調用的視乎都會自動取得兩個特殊變量:this 和 arguments。內部函數在搜索着兩個變量時,智慧搜索 到其活動對象位置,所以永遠不可能直接訪問外部函數中的這兩個變量。

上面這句話我仍然沒讀懂。

說一下本身的理解:

alert(obj.get()());

彈出obj.get()

alert(obj.get());

會獲得

function (){
    return this.name;
}

所以alert(obj.get()());只不過是匿名函數在全局裏的執行,會返回window的name屬性。

來驗證本身的想法,將函數進行修改

var name='window';
    let obj={
        name:'obj',
        get:function(){
             return function (){
                return obj.name;
            }
        }
    };
    alert(obj.get()());//obj

能夠訪問到obj裏的name屬性,由此能夠看出上邊獲得的結論是正確且符合邏輯。在匿名函數的做用域中window的name屬性相對於obj的name屬性更近一些。


 

 

若是能幫到你,不勝榮幸。

相關文章
相關標籤/搜索