1.前言
函數需要先定義,後使用。 這基本上所有程式設計語言的一條鐵的定律。
一般狀況下, 我們需要調用一個JavaScript 函數, 基本的狀況都是先定義, 然後再調用。 看一個例子
複製代碼 代碼如下:
<!--by oscar999 2013-1-16-->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Say Hello</title>
</head>
<body>
<script>
//define function
function sayHello()
{
alert("hello");
}
//call function
sayHello();
</script>
</body>
</html>
但是如果不需要顯示調用函數, 讓這個函數在定義的時候就執行的話, 該如何寫才可以呢?
2.思考的曆程
從以上的例子來看,聰明的你結合以上的使用狀況可能會想:
===》既然調用的時候是在函數名後面加上一對 是否在function 定義的後面加上一對大括弧是否就可以執行了呢? 像以下這樣:
複製代碼 代碼如下:
function sayHello()
{
alert("hello");
}();
不幸的是,以上的寫法會報出js 的語法錯誤。
因為Javascript 的解析器在解析器解析全域的function或者function內部function關鍵字的時候, 預設會把大括弧解析成function聲明,而不是function運算式。
也就是說, 會把最後的一對大括弧預設解析成一個缺少名字的function,並且拋出一個語法錯誤資訊,因為function聲明需要一個名字。
===》 你可能又會想, 如果我在大括弧中傳入參數是否就會解析成運算式了呢?
複製代碼 代碼如下:
function sayHello()
{
alert("hello");
}(1);
的確, 錯誤是沒有了。 但是以上的寫法等同於以下寫法的效果
複製代碼 代碼如下:
function sayHello()
{
alert("hello");
};
(1);
這兩句完全沒有關係, 函數還是不會執行
3.正確的寫法
對於JavaScript 來說,括弧()裡面不能包含語句,所以在這一點上,解析器在解析function關鍵字的時候,會將相應的代碼解析成function運算式,而不是function聲明所以,只要將大括弧將代碼(包括函數部分和在後面加上一對大括弧)全部括起來就可以了。
複製代碼 代碼如下:
(function sayHello()
{
alert("hello");
}());
還有一種寫法也可以, 就是將後面的大括弧移出來, as
複製代碼 代碼如下:
(function sayHello()
{
alert("hello");
})();
推薦是使用第一種方式。
但是目前很多比較好的js library 使用的都是第二種方式。
比如: web 圖形繪製的: git , draw2d ,....