簡體   English   中英

匿名成員模式導出/導入功能

[英]Anonymous Member Pattern Export/Import Function

我有點困惑。 啟動下面指定的匿名成員模式時參數的用途是什么:

(function (<ParameterA>) {

})(<ParameterB>);
  1. 據我所知,參數A用於指定函數的范圍是真的嗎?
  2. 是否導出函數的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並獲取像ab這樣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/

上面的代碼塊在聲明之后立即執行匿名函數。

  1. ParameterA是您聲明的匿名函數的參數
  2. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM