JavaScript中函數
函數的大體分三種,一種是函數的聲明,一種是函數表達式(又稱為函數的字面量)
1.函數的聲明 => function myFn(){};
2.函數的表達式 => var myFn = function() {};
3.函數對象方式 => var myFn = new Function(‘n1‘,‘n2‘,‘return n1 + n2 ‘); // tip: 參數必須加引號
以上:3和其他的兩項用法差別較大,不作比較;主要介紹1與2的區別:
先看二個簡單的例子:
var myFn = function () { console.log(‘mm‘); }; myFn();//mm var myFn = function () { console.log(‘nn‘); }; myFn(); //nn
在看下這個:
function myFn() { console.log(‘mm‘); }; myFn(); //nn function myFn() { console.log(‘nn‘); }; myFn(); //nn
為什麽會出現以上兩種情況呢? 我們知道JavaScript的代碼是一行一行執行的,但是在代碼執行之前,瀏覽器會有一個預解析的過程,會把聲明的變量,函數的表達式提升,然後再一行一行的執行代碼;但是為什麽兩個打印的結果不一樣呢? 因為第一個是變量的提升,函數本身並沒有提升,而第二個函數表達式會整個提升,所以myFn()寫在哪,結果都是一樣的;
我們這個時候可能回想,如果他們在一起的時候,哪個先執行?
第一種情況:
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,這是變量定義,但是沒有賦值,只有在函數賦值後,才能打印該值;
JavaScript中函數