JavaScript中函數的變量提高問題

函數的大致分三種,一種是函數的聲明,一種是函數表達式(又稱爲函數的字面量)瀏覽器

  1.函數的聲明 => function myFn(){};函數

  2.函數的表達式 => var myFn = function() {};spa

  3.函數對象方式 => var myFn = new Function('n1','n2','return n1 + n2 ');  // tip: 參數必須加引號code

以上:3和其餘的兩項用法差異較大,不做比較;主要介紹1與2的區別:對象

  先看二個簡單的例子:blog

var myFn = function () {
    console.log('mm');
};

myFn(); //mm

var myFn = function () {
    console.log('nn');
};

myFn(); //nn

在看下這個:ip

function myFn() {
    console.log('mm');
};
myFn(); //nn

function myFn() {
    console.log('nn');
};
myFn(); //nn

  爲何會出現以上兩種狀況呢? 咱們知道JavaScript的代碼是一行一行執行的,可是在代碼執行以前,瀏覽器會有一個預解析的過程,會把聲明的變量,函數的表達式提高,而後再一行一行的執行代碼;可是爲何兩個打印的結果不同呢? 由於第一個是變量的提高,函數自己並無提高,而第二個函數表達式會整個提高,因此myFn()寫在哪,結果都是同樣的;io

  咱們這個時候可能回想,若是他們在一塊兒的時候,哪一個先執行?console

  第一種狀況:function

var myFn = function () {
    console.log('nn');
}
myFn();  // nn

function myFn() {
    console.log('mm');
}
myFn(); // nn

  第二種狀況:

function myFn() {
    console.log('mm');
}
myFn(); // mm

var myFn = function () {
    console.log('nn');
}
myFn(); // nn

  這裏注意的一點是,變量的提高高於函數表達式;在第一種狀況下,var  = myFn 會提高最高的優先級,其次是函數的聲明。

  在第一種狀況裏,函數的聲明會提高,而後會被函數表達式覆蓋,因此會打印兩次同樣的;第二次該提高的會提高,代碼會一步一的執行;  

看一下,下面的一段的代碼執行狀況,檢驗一下:

myFn();
function myFn() {
    console.log('mm');
}
myFn();
var myFn = function () {
    console.log('nn');
}

這裏能夠很明顯的看到結果 =>打印兩次  // mm

 

下面咱們在介紹一種,在函數內部的變量提高(先看一段代碼)

function myFn(a) {
    var a = 2;
    console.log(b);
    console.log(a);
    var b = 0 ;
}
myFn(1);  // undefined 2

在函數的內部,若是函數有參數的話,就至關於在函數內部聲明瞭這個變量,如上面例子:先聲明 var a;調用的時候傳來參數,則 a =1 ,若果在函數內部把a在賦值,那麼a就等於新賦值的值;而b是否是參數,但在函數內部定義了,因爲變量的提高,會打印underfind,這是變量定義,可是沒有賦值,只有在函數賦值後,才能打印該值;

相關文章
相關標籤/搜索