之前寫過一篇JavaScript 閉包究竟是什麼的文章理解閉包
作用域
作用域就是變量和函數的可訪問范圍
單純的JavaScript作用域還是很好理解的
變量沒有在函數內聲明或者聲明的時候沒有帶var就是全局變量
復制代碼 代碼如下:
var a=
function fn(b){ //局部變量
c=
var d=
function subFn(){
var e=d; //父函數的局部變量對子函數可見
for(var i=
console
}
alert(i);//
}
}
alert(c); //在function內聲明但不帶var修飾
只要是理解了JavaScript沒有塊作用域
復制代碼 代碼如下:
console
var a=
console
console
上面代碼在執行前var a=
復制代碼 代碼如下:
var a;
console
a=
console
然而
如果只是這樣那麼JavaScript作用域問題就很簡單了
全局執行環境是最外層的一個執行環境
作用域鏈
當代碼在一個環境中執行時
復制代碼 代碼如下:
function a(x
var b=x+y;
return b;
}
在函數a創建的時候它的作用域鏈填入全局對象
如果執行環境是函數
復制代碼 代碼如下:
function a(x
var b=x+y;
return b;
}
var tatal=a(
這時候 var total=a(
在函數運行過程中標識符的解析是沿著作用域鏈一級一級搜索的過程
再來看看閉包
之前博客曾經總結道
復制代碼 代碼如下:
for(var i=
elements[i]
alert(i);
}
}
這是上篇博客提到過的經典錯誤
由於內部函數(click事件處理程序時刻有調用可能)
復制代碼 代碼如下:
for(var i=
(function(n){
elements[n]
alert(n);
}
})(i);
}
為什麼這樣就行了呢
最後
其實理解了執行環境和作用域鏈後
From:http://tw.wingwit.com/Article/program/Java/JSP/201405/30945.html