javascript之模擬塊級作用域
阿新 • • 發佈:2017-06-11
es6 匿名 重新 ror 一段 put 使用 模仿 保存
在java、C++等語言中,變量i在會在for循環的語句塊中定義,循環一旦結束,變量i就會被銷毀。可是在javaScript中,從定義開始,就可以在函數內部隨處訪問。比如
function output(){ for(var i=0; i<10; i++){ } alert(i); //10 var i; //重新聲明 alert(i); //10 }
javaScript會對後續i的聲明視而不見,如果後續聲明中有變量初始化還是會執行。可以使用匿名函數來模仿塊級作用域,或者使用ES6的let命令。
用塊級作用域的匿名函數的語法如下:
(function(){ //塊級作用域 }) ();
將函數聲明保存在一對圓括號中,表示它實際上是一個函數表達式,緊隨其後的另一個圓括號會立即調用這個函數。
function output(){ (function(){ for(var i=0; i<10; i++){ } })(); alert(i); //error var i; //重新聲明 alert(i); //undefined }
這種技術經常在作用域中被用在函數外部,從而限制向全局作用域中添加過多的變量和函數。js引擎讀取一段js代碼,首先預解析(這個名字我起的),就是逐行讀取js代碼,尋找全局變量和全局函數,遇到全局變量,把變量的值變為undefind,存在內存中,遇到全局函數,直接存在內存中,這個過程如果發現語法錯誤,預解析終止。限制全局作用域可以減少內存的占用。
或者使用let命令
function output(){ for(let i=0; i<10; i++){ var i; alert(i); // undefined }
javascript之模擬塊級作用域