在一些類似c語言的程式語言中,花括號內的每一段程式碼都具有各自的作用域,而且變數在聲明他們的程式碼段之外是不可見的,我們稱為區塊級作用域( block scope),而javascript沒有區塊級作用域。取而代之的javascript使用的是函數作用域(function scope):變數在聲明它的函數體以及這個函數體嵌套的任意函數體內都是有定義的。 在如下程式碼中,在不同位置定義的i,j和k,他們再同一個作用域內都是有定義的
javascript的函數作用域指在函數內部宣告的所有的變數在函數體內總是可見的。有趣的是,這意味著變數在聲明之前甚至已經可用。 javascript的這個特性被非正式的稱為聲明提前(hoisting),即javascript的函數體內聲明的所有的變數(不涉及賦值)都被「提前」至函數體的頂部。看以下程式碼
由於函數作用域的特性,局部變數在整個函數體總是有定義的,也就是說在函數體內部變數遮蓋了同名的全域變數。儘管如此在程式執行到var語句的時候,局部變數才會被真正的賦值,因此,上述過程等價於:將函數內的變數宣告「提前」至函數體頂部,同事變數初始化留在原來的位置: