ES6-var宣告與變數提升
阿新 • • 發佈:2018-12-21
var宣告與變數提升
變數宣告
- JavaScript中,使用一個變數之前,先用var關鍵字宣告它,變數如果沒有賦值,則初始化值為undefined
- 宣告變數時,如果不寫var,則會被定義為全域性變數,而且並不是在函式內部寫了變數,這個變數就屬於這個函式的作用域;必須用var來宣告,這個變數才會屬於這個作用域
作用域
- 一個變數的作用域就是變數起作用的範圍區間。在ES5中,js只有兩種形式的作用域:全域性作用域和函式作用域
- 函式允許訪問函式外的變數,程式碼中只有函式才可以限定作用域
- 當前函式作用域中的變數能覆蓋全域性作用域中的同名變數
- 分析作用域首先理解變數提升規則
變數提升
- var關鍵字宣告的變數,無論實際宣告的位置在何處,都會被視為宣告在函式的頂部(如果宣告不在任意函式內,則視為在全域性作用域的頂部)。JavaScript引擎的工作方式是,先預解析程式碼, 獲取所有被宣告的變數和函式宣告,然後再一行一行地執行,這就使所有變數宣告的語句,都會被提升到程式碼的頭部,這就是變數提升。
console.log(a); //undefined
var a = 1;
console.log(a); // 1
上面程式碼首先在控制檯顯示未宣告的變數,本來是錯誤的做法但是沒有報錯.因為JS的變數提升.真正執行的是以下程式碼
var ;
console.log(a);
a = 1
console.log(a);
在ES5中,js只有兩種形式的作用域:全域性作用域和函式作用域。
全域性作用域其實是全域性物件的作用域,任意地方都可以訪問到(如果沒有被函式作用域覆蓋)。
var i = 2; //全域性變數,全域性作用域
function outer(){ //定義外部函式
console.log(i); //訪問全域性變數 2
function inner(){ //定義內部函式
console.log(i); //訪問全域性函式 2
}
inner();
}
outer();
console.log(i); //2
函式內部定義變數時,如果不寫var,比如下面的x = 9,則會被定義為全域性變數,作用域為全域性作用域,在宣告語句後的任何位置都可以訪問,否則為區域性變數,則作用域為函式作用域
function getResult(){ //定義外部函式
var c = 4; //定義區域性變數
function open(){ //定義內部函式
x = 8;
var y = 9;
console.log(c); // 訪問函式外部的區域性變數 4
}
open();
console.log(x);
// console.log(y); //區域性變數.訪問不了,報錯未定義
}
getResult();
console.log(x);
//console.log(y); //區域性變數.訪問不了,報錯未定義
函式提升
函式的定義:函式表示式 var f1 = function(){ alert();} //匿名方式
宣告式函式 function f2(){ alert();} //命名方式 先於函式執行程式碼被解析器解析
1)函式表示式中的函式宣告不會被提升,變數會被提升,如上面的舉例程式碼
2)宣告式函式中,函式同名,函式全部提升,後者覆蓋前者
var p = 1;
function add(num){
return num = num + 1;
}
y = add(p);
function add(num){
return num= num+ 2;
}
z = add(p);
console.log(y); //3
console.log(z); //3
3)如果有變數和函式同名,則會忽略掉變數,只提升函式
console.log(foo); // foo(){ }
function foo(){ }
var foo = 2;
console.log(foo); // 2