1. 程式人生 > >ES6-var宣告與變數提升

ES6-var宣告與變數提升

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