js中只有2種作用域:全域性作用域和函式作用域,沒有塊級作用域。迴圈內定義的變數,相當於定義在迴圈所在的空間,出了迴圈仍可繼續使用。
console.log(temp); //不會報錯,迴圈體沒有塊級作用域,迴圈內的變數相當於直接宣告在當前**塊的最前面
for(var i=0;i<10;i++)
}
宣告提前(hoisting):在函式正式執行前,提前預讀var宣告的變數名和function宣告的函式名及函式體,並將其集中到【當前作用域】的頂部建立。變數的賦值仍等執行到所在行時執行。
函式定義時,不會讀取函式內部的內容,只有被呼叫時才會。所以閉包一定要等外部函式執行後內部函式的作用域才會被增長。
函式宣告和變數宣告一樣也會提前到函式體的最前面,同名時剛進入函式時,只有同名的函式,因為變數還未賦值。執行後再看該名字最後被賦什麼值。
變數僅僅是重複宣告不會改變原有變數的值,不產生任何影響。
functionhoisting()
function
hositing2()
//函式宣告提公升
function
test() //
不再執行函式定義,識別符號a不會重新被賦值,仍然為1
console.log(a);
}()//等同於如下
function test()
console.log(a);
a=1;
console.log(a);}//
函式宣告提前,所以識別符號是有值的
var test=5;
test();
//會報錯,開始執行時test指代函式,後面的賦值覆蓋了同名函式,呼叫會報錯。
function
test()
在函式中,形參是區域性變數,相當於在函式的第一句就var乙個變數並賦值,進入函式時就有值,函式體內和形參同名的變數宣告只是重新給形參賦值而已,並不會建立新的變數。
functiong(arg)
g(5); //
輸出10,true
變數宣告提前與函式宣告提前
變數的宣告提前 在全域性作用域中,使用var關鍵字宣告的變數會在所有的 執行之前被宣告,但是不會賦值。所以我們可以在變數宣告前使用變數。但是不使用var關鍵字宣告的變數不會被宣告提前。在函式作用域中,也具有該特性,使用var關鍵字宣告的變數會在函式所有的 執行前被宣告,如果沒有使用var關鍵字宣告變...
變數宣告提前 總結 js
js在執行時,js變數宣告語句無論出現在何處,都會先於其他 首先被執行。使用var的宣告的變數會提前。先舉個例子看看 console.log a function a var a 3 var b function console.log a 3function a b console.log a 4...
js 理解變數宣告提前
console.log a 不會出錯,會輸出undefined var a 100 console.log a 100 由於從上往下執行時遇見了var,所以實際執行順序 var a 宣告提前 console.log a undefined a 100 賦值任然留在原位置 console.log a ...