1. 程式人生 > >作用域與變量提升

作用域與變量提升

ole 訪問 內置對象 function 執行 name 兩種 局部變量 ()

作用域與變量提升


作用域

JS中變量的作用域有全局作用域和局部作用域兩種,作用域簡單來講就是變量與函數的可訪問範圍。

  • 全局作用域:
    1.最外層函數和最外層函數外面定義的變量。
    2.未聲明直接賦值的變量,自動聲明為全局變量。
    3.window對象的內置對象,如window.name,window.location。
  • 局部作用域:
    一般會出現在函數內部,只有固定的代碼段才可以訪問。

    局部作用域變量優先於全局變量,函數只是一個作用域的基本單位。

例1:
var name = "one"; function test() { name = "two" } test(); console.log(name) //輸出為 two


解析
??函數內部省略var,會影響全局變量,name被重置為全局變量。js中,函數是一個作用域的基本單位,函數內聲明的所有變量在函數體內始終是可見的。

例2:
function test() { var name = "one" ; return function () { console.log(name) } } test()();

test()之後將調用外層函數test返回內層函數function,再繼續(),相應調用執行了內層函數function(),輸出name。

變量提升

聲明提前是在js預編譯是就進行了,變量提升知識提升變量的聲明,並不會吧值也提上來。

例1:

var name = "one" ;
function () {
   console.log(name)   //one
   name = "two" ;
   console,log (name)  //two
}
test();
var name = "one" ;
function () {
   console.log(name) ;    //undefine
   var name = "two" ;
   console.log(name)      //two
}
test()

解析:
局部優先於全局,預編譯(變量提升),所以函數內的name為局部變量,所以第一個位undefine。

內部不影響外部

function test(name) {
   console.log(name)    //name
   name = "two"
   console.log(name)    //two
}
var name = "one"
test(name)
console.log(name)      //one

解析:
??傳進test的,實際上是一個副本,函數返回後這個副本就被清除了,並非實際的name。

作用域與變量提升