javascript函數執行前期變量環境初始化過程


示例代碼如下:
var d = '全局的';
(function(){
 alert(d == undefined);//結合步驟4
 var d = 123;
})();
(function(a){
 var a;
 alert(a == 123);//結合步驟1,4;
})(123);
(function(){
 alert(typeof a == 'function');//結合步驟2,4;
 function a(){}  //這句換下面,結果還是一樣
 var a = 234;
})();
(function(){
 alert(typeof a == 'function');//結合步驟2,4
 var a = 234;//這里賦值是在函數初始化完成后執行階段完成的,因此下面a的類型變成了number
 alert(typeof a == 'number');//並沒有違反步驟2,4規則,由於這是在執行期間判斷的,上面的邏輯已經將a改變了
 function a(){}
})();

函數執行前期初始化變量環境走了如下過程:
1、遍歷參數列表,添加到函數變量環境並賦值。
2、遍歷函數聲明,如果函數變量環境中存在則賦值,不存在則添加並賦值。
3、添加arguments並賦值【這里不同瀏覽器表現差異較大,並不一定都是這樣】
4、遍歷函數中所有的變量聲明,如果變量環境中存在則不作任何操作,不存在則添加並賦值undefined。
這四個步驟完成后,函數才開始真正執行相關邏輯,所有的賦值語句才開始從上往下生效。
 
手打累了,不打了,看到這里應該也明白了函數聲明提前問題了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM