[英]Anonymous Member Pattern Export/Import Function
我有點困惑。 啟動下面指定的匿名成員模式時參數的用途是什么:
(function (<ParameterA>) {
})(<ParameterB>);
最后,我經常看到腳本表明以下內容:
})(jQuery || myfunc);
這是否意味着他們正在導出這些或返回這些對象? 使用兩個管道(||)有什么意義; 這是射門的事嗎?
提前致謝。 期待有趣的討論。
參數A未指定函數的范圍。 函數的位置決定了函數的范圍。 參數B不是導出函數的位置。 事實上,這個設置的方式,沒有指向任何地方的函數指針,使其成為“匿名函數”。 換句話說,功能本身是不可導出的。 通常當你談論導出東西時,你談論的是導出你在匿名函數中定義的變量。 例如,這里我從匿名函數導出函數my_inner_function
。
(function (<ParameterA>) {
// export this function here.
window.my_inner_function = function() {
...
};
})(<ParameterB>);
通常,匿名函數的關鍵在於您擁有各種不想導出的變量,因為您不希望與其他代碼混淆。
(function (<ParameterA>) {
// convert could be defined somewhere else too, so to be on the safe side
// I will hide it here in my anonymous function so nobody else can
// reference it.
var convert = function() {
...
};
})(<ParameterB>);
當您壓縮Javascript並獲取像a
和b
這樣a
函數名時,這一點尤為重要。
(function (<ParameterA>) {
// So compressed!
var a = function() {
...
};
})(<ParameterB>);
(function () {
// Another compressed thing! Good thing these are hidden within anonymous
// functions, otherwise they'd conflict!
var a = function() {
...
};
})();
現在這個
(function (<ParameterA>) {
})(<ParameterB>);
是一樣的
// Assume ParameterB is defined somewhere out there.
(function () {
var ParameterA = ParameterB;
})();
這讓您了解為什么要使用這些參數。 您可能會發現參數方法不那么令人困惑,或者您可能希望明確表示您不希望影響“按值”變量(如數字和字符串)。
正如其他人所指出的那樣, a || b
a || b
被說成“A或B”,意思是“ a
,如果a
計算結果為true,否則b
,不管是什么b
是”。
編輯
要回答你的問題,當你到達})();
()
導致匿名函數運行。 請記住,Javascript引擎將首先解析所有代碼以確保語法正確,但實際上不會評估/執行任何代碼,直到它到達該代碼。 因此,當匿名函數運行var ParameterA = ParameterB;
得到評估。 以下是一些希望有所幫助的例子。
var ParameterB = "hello";
(function () {
var ParameterA = ParameterB;
// alerts "hello" because when this line is evaluated ParameterB is still
// "hello"
alert(ParameterA);
})(); // () here causes our anonymous function to execute
ParameterB = "world";
現在在這個例子中,該函數不再是匿名的,因為它有一個指針。 但是,它的行為與前一個示例相同。
var ParameterB = "hello";
var myFunction = function () {
var ParameterA = ParameterB;
// alerts "hello" because when this line is evaluated ParameterB is still
// "hello"
alert(ParameterA);
};
myFunction();
ParameterB = "world";
在此示例中,我更改了最后2行的順序並獲得了不同的結果。
var ParameterB = "hello";
var myFunction = function () {
var ParameterA = ParameterB;
// alerts "world" because when this line is evaluated ParameterB has
// already changed.
alert(ParameterA);
};
// notice that I moved this line to occur earlier.
ParameterB = "world";
myFunction();
對於第1部分和第2部分,ParameterA可用於別名嵌套層次結構。 (即:作為ParameterB YAHOO.util.Event passed
,可以在ParameterA中用作“ e
”。)這樣,在匿名函數內部,您就不會輸入完整的命名空間路徑。 [我知道你是一個jquery家伙,但雅虎命名空間更長,並說明了更好的點:)]或者,您可以手動將引用存儲在函數內的var中。
jquery || myFunc
jquery || myFunc
語法是“如果它是真實的/可用則使用jquery,或者如果不是則使用jquery || myFunc
”的簡寫。
它有點像var toUse = jQuery !== undefined ? jQuery : myFunc;
var toUse = jQuery !== undefined ? jQuery : myFunc;
這是因為javascript允許虛假值評估而不將對象完全轉換為布爾值。 ie:undefined是falsy,“”是falsy,null是falsy。
替代方法可用於檢測方法或屬性是否甚至可用於&&。
即: var grandParent = person && person.parent && person.parent.parent;
只有當此人擁有父母且其父母擁有父母時,才會定義此項。 沿&&前導到最后一個語句的任何失敗都將導致未定義grandParent。
最后,圍繞着||的parens 快捷語法基本上是在聲明后立即執行函數,將計算值傳遞給匿名函數。
即:( (function(a, b) { return a + b; })(2,3)
將立即執行並返回5.實際上,此匿名函數執行可與模塊模式一起使用,以建立一組公共方法,這些方法使用本身未出現在頁面命名空間中的私有函數。 這比您原來的問題更深入,但您可以查看這篇文章以獲取更多信息:http: //yuiblog.com/blog/2007/06/12/module-pattern/
上面的代碼塊在聲明之后立即執行匿名函數。
ParameterA
是您聲明的匿名函數的參數 ParameterB
是您傳遞給ParameterA
的值 所以,你聲明的功能將被立即執行,傳遞ParameterB
作為值ParameterA
。
jQuery || myFunc
jQuery || myFunc
塊意味着:使用jQuery
作為參數,除非它沒有定義,在這種情況下使用myFunc
。
編輯:
這通常在定義jQuery插件時使用,以避免在使用多個javascript庫時與$
variable沖突。 因此,您可以將插件定義設置為接受$
作為參數的函數,您將立即執行該函數,將jQuery
作為值傳遞給$
。
示例(來自jQuery docs):
(function( $ ){
$.fn.myPlugin = function() {
// Do your awesome plugin stuff here
};
})( jQuery );
上面代碼塊的結果將是一個插件定義,保證$
將成為jQuery
的別名。
ParameterA引用在ParameterB中傳遞的值。 這個:
(function (<ParameterA>) {
})(<ParameterB>);
有點像這樣:
function test(<ParameterA>) {
}
test(<ParameterB>);
不同之處在於,您使用閉包在全局命名空間中沒有沖突的函數。
對於第二部分:|| 有點像param = jQuery ? jQuery : myFunc
param = jQuery ? jQuery : myFunc
。 它傳入jQuery(如果已定義),或myFunc(如果不是)。
第一部分:
(function (<ParameterA>) {
})(<ParameterB>);
這意味着函數外部稱為ParameterB
的變量將在函數內部稱為ParameterA
。 這被稱為自執行函數,因為函數在定義后立即被調用。 這意味着您可以在函數內部使用ParameterA
,而不會覆蓋函數外部的變量。
例如:
(function($){
})(jQuery);
這意味着您可以在函數外部使用$
,例如Mootools,並在其中使用jQuery。
第二部分:
})(jQuery || myfunc);
如果它存在,則調用傳遞jQuery
變量的函數,如果不存在,則調用myfunc
。 我不知道你為什么要這樣做......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.