顯示廣告
隱藏 ✕
※ 本文為 dinos.bbs. 轉寄自 ptt.cc 更新時間: 2012-11-30 16:36:10
看板 Ajax
作者 kilva (嗡嗡)
標題 Re: [問題] (...)()或(...)(window)是什麼意思?
時間 Sat Jul 14 00:28:09 2012


這種寫法稱為匿名函式;在JavaScript設計模式中,也稱為立即函式,因為此
函式會在定義時立即執行。

立即函式有兩種寫法:
(function(arg){
// 程式碼
}(in));

(function(arg){
// 程式碼
})(in);
其中的in用來傳入值給參數arg。如:
(function(person,career){
    console.log(person + " is a " career);
}("Eric","student"));
會顯示「Eric is a student」。

立即函式是由JavaScript中的兩種語法所組成的。

第一種是函式呼叫:函式可以在定義時就呼叫。
函式可以賦值給某個變數。如:
var func = function(arg){/*程式碼*/};
上面的func即是一個函式,可以使用func(arg)來呼叫函式。
更甚之,函式可以在定義時就呼叫,如:
var val = function(){return 2+2}();
上面的程式碼等於
var func = function(){return 2+2}; var val = func();
func是個總是傳回4的函式,而val則是個值為4的變數。
(請注意函式和函式呼叫的不同之處。)

第二種是實字:實字可以賦值或不賦值給某個變數。不過函式及物件沒有賦值
給某個變數時須外加上括號才會成為函式實字或物件實字。數字、字串和正規
運算式就沒這個限制,如:

"a".toUpperCase(); // 會傳回"A"。
/[\s]+/.exec(string); // 會傳回string中匹配正規運算式的字串陣列。
1+2; // 會傳回3。
(1).toString(); // 但使用數字實字的方法時須外加括號。

上面兩個語法合起來即為立即函式。

「fucntion(){/*程式碼*/}();」沒有賦值給變數會產生錯誤。
「(function(){/*程式碼*/}());」或「(function(){/*程式碼*/})();」則為
合法的述句。

※ 引述《cyutdt (DT)》之銘言:
: 常在程式看到
: (function() {
:     ...
: })();
: 或
: (function() {
:     ...
: })(window);
: 我已經看過closure的相關教學和討論
: 還是不曉得這跟closure是否有關聯
: 還是跟$(document).ready(function(){});有什麼關係呢?
: 看到一些這種範例
: 不曉得為什麼要這樣寫

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.44.117.126
※ 編輯: kilva           來自: 114.44.117.126       (07/14 00:29)
s25g5d4:之前有看過!function(){}() +function(){}()的寫法1F 07/14 11:10
MOONRAKER:實字?這什麼翻譯。常數還差不多。2F 07/17 21:13
MOONRAKER:或者是指identity?那叫「識別項」。
沒看過實字(literal)?這明明是JavaScript中基本到不能不學的概念!
數字、字串和陣列實字可以當做是常數沒問題,但只當做是常數就太可惜了。
正規運算式、函式及物件實字更是無法看做常數,也不需要有識別項來稱呼。
光是「1」就已經有一些方法可用了,如:
(1).toString();         // "1"
(1).toExponential(2);   // "1.00e+0"
等。(但一般還是會賦值給變數,連同內建的方法一併給予。)
s25g5d4:object(array) literal 我大部分看都翻成物件(陣列)實字4F 07/17 21:26
※ 編輯: kilva           來自: 114.44.135.203       (07/17 22:19)

--
※ 看板: dinos 文章推薦值: 0 目前人氣: 0 累積人氣: 662 
※ 本文也出現在看板: KnucklesNote
分享網址: 複製 已複製
guest
x)推文 r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇