第一個問題
function ( ) {
console.log("fun1");
}() 為什么執行不了?
.
“函數使用function關鍵字來定義,可以使用函數定義表達式或者函數聲明語句。兩種形式中,函數定義都是從function關鍵字開始。其后跟隨:函數名稱標識符(函數名稱是函數聲明語句必需的部分;對於函數定義表達式來說,這個名字是可選的:如果存在,該名字只存在於函數體中,並指代該函數對象本身)。”—摘自《JavaScript權威指南》
1、使用function聲明的函數,必須要有函數名稱,否者會拋出語法錯誤。上面的代碼執行過程中,解析器解析function關鍵字時,默認該代碼是function聲明,而不是function表達式,編譯器會默認生成一個缺少名字的function,並且拋出一個語法錯誤。
代碼執行結果,如圖:
2、那么試一下給function加上名字,看看還會不會報錯。
結果依然報錯,雖然上面的代碼已經沒有語法問題,但是問題出在圓括號運算符“( )”,我們來理解一下圓括號運算符“( )”,也稱為分組運算符,它有兩種用法:如果表達式放在圓括號中,作用是求值;如果跟在函數后面,作用是調用函數。
為什么會這樣呢?在一個表達式后面加上圓括號,表示該表達式立即執行;而如果是在一個語句后面加上括號,該括號完全和之前的語句不搭,而只是作為一個分組運算符,用來控制運算中的優先級(小括號里的先運算),所以以上代碼等價於:
相當於先聲明了一個叫fn的函數,之后進行“( )”內的表達式運算,但是“( )”分組運算符內的表達式不能為空,所以報錯。
第二個問題
(function ( ) {
console.log("fun1");
})()
.
(function ( ) {
console.log("fun1");
}())
為什么能執行?
1、在JavaScript里,括號內部不能包含語句,當解析器對代碼進行解析的時候,先碰到了(),然后碰到function關鍵字就會自動將()里面的代碼識別為函數表達式而不是函數聲明。
2、(function(){})會返回函數對象的引用,最后使用圓括號()調用此函數。
第一個問題
function ( ) {
console.log("fun1");
}() 為什么執行不了?
.
“函數使用function關鍵字來定義,可以使用函數定義表達式或者函數聲明語句。兩種形式中,函數定義都是從function關鍵字開始。其后跟隨:函數名稱標識符(函數名稱是函數聲明語句必需的部分;對於函數定義表達式來說,這個名字是可選的:如果存在,該名字只存在於函數體中,並指代該函數對象本身)。”—摘自《JavaScript權威指南》
1、使用function聲明的函數,必須要有函數名稱,否者會拋出語法錯誤。上面的代碼執行過程中,解析器解析function關鍵字時,默認該代碼是function聲明,而不是function表達式,編譯器會默認生成一個缺少名字的function,並且拋出一個語法錯誤。
代碼執行結果,如圖:
2、那么試一下給function加上名字,看看還會不會報錯。
結果依然報錯,雖然上面的代碼已經沒有語法問題,但是問題出在圓括號運算符“( )”,我們來理解一下圓括號運算符“( )”,也稱為分組運算符,它有兩種用法:如果表達式放在圓括號中,作用是求值;如果跟在函數后面,作用是調用函數。
為什么會這樣呢?在一個表達式后面加上圓括號,表示該表達式立即執行;而如果是在一個語句后面加上括號,該括號完全和之前的語句不搭,而只是作為一個分組運算符,用來控制運算中的優先級(小括號里的先運算),所以以上代碼等價於:
相當於先聲明了一個叫fn的函數,之后進行“( )”內的表達式運算,但是“( )”分組運算符內的表達式不能為空,所以報錯。
第二個問題
(function ( ) {
console.log("fun1");
})()
.
(function ( ) {
console.log("fun1");
}())
為什么能執行?
1、在JavaScript里,括號內部不能包含語句,當解析器對代碼進行解析的時候,先碰到了(),然后碰到function關鍵字就會自動將()里面的代碼識別為函數表達式而不是函數聲明。
2、(function(){})會返回函數對象的引用,最后使用圓括號()調用此函數。