javascript 聲明函數
JavaScript有兩種聲明函數的方式,一個是函數表達式定義函數,也就是我們說的匿名函數方式,一個是函數語句定義函數,下面看代碼:
/*方式一*/var FUNCTION_NAME = function() { /* FUNCTION_BODY */};/*方式二*/function FUNCTION_NAME () { /* FUNCTION_BODY */};
區別一
方式一的聲明方式是先聲明后使用
方式二的聲明方式可以先調用,后聲明
/*方式一: *先聲明后使用 *///f1();這里調用就會出錯 var f1 = function () { alert("var方式");}f1();//這里使用才正確/*方式二: *可以先使用后聲明 */f2(); //這里調用可以正常執行 function f2 () { alert("function方式");}f2();//這里調用可以正常執行
區別二
//方式一var FUNCTION_NAME = function() { /* FUNCTION_BODY */};/*這種方式,編譯后變量聲明 FUNCTION_NAME 會“被提前”了,但是他的賦值(也就是FUNCTION_BODY)并不會被提前。匿名函數只有在被調用時才被初始化。*///方式二function FUNCTION_NAME () { /* FUNCTION_BODY */}; /*這種方式, 編譯后 函數聲明 和 賦值 都會被提前。即函數聲明過程在整個程序執行之前的預處理就完成了,所以只要處于同一個作用域,就可以訪問到,即使在定義之前調用它也可以。*/
下面看一個例子:
function f() { alert('1');}f(); // 彈窗內容是:2function f() { alert ('2');}
運行時 f() 執行的是alert (‘2');主要原因是JavaScript 函數聲明的“提前”行為,簡而言之,就是Javascript允許我們在變量和函數被聲明之前使用它們,而第二個定義覆蓋了第一種定義。換句話說,上述代碼編譯之后相當于:
function f() { alert('1');}function f() { alert ('2');//申明前置了,但因為這里的申明和賦值在一起,所以一起前置}f(); // 彈窗內容是:2
下面再看一個例子:
var f= function() { alert('1');}f(); // 彈窗內容是:1function f() { alert ('2');}
這里就是我們期待的behavior,這段程序編譯之后相當于:
var f; //申明前置了function f() { alert('1');}f(); // 彈窗內容是:1function f() { alert ('2');}
最后再看一個例子:
f(); //第一次調用函數 彈窗內容是:2var f= function() { alert('1');}f(); //第二次調用函數 彈窗內容是:1function f() { alert ('2');}f(); //第三次調用函數 彈窗內容是:1
看到結果大家應該都明白了吧。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
新聞熱點
疑難解答