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屬性更近一些。
若是能幫到你,不勝榮幸。