js中變數的作用域
變數作用域
一個變數的作用域(scope)是成語原始碼中定義這個變數的區域。全域性變數擁有全域性作用域。在js中任何地方都是有定義的。然而在函式內宣告的變數只在函式體內有定義。他們是區域性變數,作用域時區域性性的,函式引數也是區域性變數,他們只在函式體內有定義。
在函式體內,區域性變數的優先順序高於同名的全域性變數。如果在函式內生明一個區域性變數或者函式中帶有的變數和全域性變數重名,那麼全域性變數就被區域性變數所遮蓋。
var scope = "global"; //宣告一個全域性變數
function checkscope(){
var scope = "local"; //宣告一個同名的區域性變數
return scope; //返回區域性變數的值,而不是全域性變數的值
}
checkscope();
儘管全域性作用編寫時可以不用 var 語句,但宣告區域性變數時必須使用 var 語句。
函式作用域和宣告提前
js中沒有像C語言中的塊級作用域(block scope),而使用了函式作用域(function scope);變數在宣告他們的函式體以及這個函式體巢狀的任意函式體內都是有定義的。
在如下所示的程式碼中,在不同位置定義了 i、j和k,他們都字啊同一個作用域內——這三個變數在函式體內君是有定義的。
function test(o){
var i = o; //在整個函式體內均有定義
if(typeof 0 =="number"){
var j = o; //j在函式體內是有定義的,不僅僅是在這個程式碼片段
for(var k = o;k< 10;k++){ //k在函式體內是有定義的,不僅僅是在迴圈內
console.log(k); //輸出數字0~9
}
console.log(k); //k已經定義了輸出10
}
console.log(j); //j已經定義了,但可能沒有初始化
}
js中的函式作用域是指在函式內宣告的所有變數在函式體內始終是可見的。這就意味著變數在宣告之前已經可用,在js函式中宣告的所有變數(但不涉及賦值),都被提前值函式的頂部。如下:
var scope= 'global';
function f(){
consoloe.log(scope); // 輸出undefined,而不是global
var scope = 'local'; // 變數在這裡賦初始值,但變數本身在函式體內任何地方均是有定義的
consoloe.log(scope); · // 輸出local
}
你可能會認為函式中第一行會輸出global,因為程式碼還沒有執行到var語句宣告區域性變數的地方。其實不然由於函式作用域的特性,區域性變數在整個函式體內始終是有定義的。也就是說,在函式體內區域性變數遮蓋了同名的全域性變數。因此只有當程式執行到var語句時,區域性變數才會被真正賦值。即等價於如下程式碼。
function f(){
var scope; //在函式頂部宣告區域性變數
consoloe.log(scope); // 變數存在,但其值是undefined
scope = 'local'; // 這裡將其初始化並賦值
consoloe.log(scope); · // 輸出local
}