匿名成员模式导出/导入功能

时间:2010-11-05 16:40:18

标签: javascript jquery anonymous-function anonymous-methods

我有点困惑。启动下面指定的匿名成员模式时参数的用途是什么:

(function (<ParameterA>) {

})(<ParameterB>);
  1. 据我所知,参数A用于指定函数的范围是真的吗?
  2. 您是导出函数的ParameterB吗?
  3. 最后,我经常看到脚本表示以下内容:

    })(jQuery || myfunc);
    

    这是否意味着他们正在导出这些或返回这些对象?使用两个管道(||)有什么意义;这是一个实地目标吗?

    提前致谢。期待有趣的讨论。

5 个答案:

答案 0 :(得分:4)

参数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等函数名称时,这一点尤为重要。

(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评估为真,则表示“a,否则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";

在这个例子中,我改变了最后两行的顺序并得到了不同 结果

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 :(得分:3)

对于第1部分和第2部分,ParameterA可用于别名嵌套层次结构。 (即:YAHOO.util.Event passed作为ParameterB,可以在ParameterA中用作“e”。这样,在匿名函数中,您就不会输入完整的命名空间路径。 [我知道你是一个jquery家伙,但雅虎命名空间更长,并说明了更好的点:)]或者,您可以手动将引用存储在函数内的var中。

jquery || myFunc语法是“如果它是真实的/可用则使用jquery,或者如果不是则使用myFunc”的简写。

有点像var toUse = jQuery !== undefined ? jQuery : myFunc;

这是因为javascript允许在不将对象完全转换为布尔值的情况下进行有价值的评估。 ie:undefined是falsy,“”是falsy,null是falsy。

备选方案可用于检测方法或属性是否可用于&amp;&amp;。

ie:var grandParent = person && person.parent && person.parent.parent;

仅当此人拥有父母且其父母拥有父母时,才会定义此项。沿着&amp;&amp;&amp;导致最后一个语句将导致grandParent未定义。

最后,围绕着||的parens快捷语法基本上是在声明后立即执行函数,将计算值传递给匿名函数。

ie:(function(a, b) { return a + b; })(2,3)

将立即执行并返回5.实际上,此匿名函数执行可以与模块模式一起使用,以建立一组公共方法,这些公共方法使用本身未出现在页面命名空间中的私有函数。这比原始问题更深入,但您可以查看此文章以获取更多信息:http://yuiblog.com/blog/2007/06/12/module-pattern/

答案 2 :(得分:3)

上面的代码块在声明后立即执行匿名函数。

  1. ParameterA是您要声明的匿名函数的参数
  2. ParameterB是您传递给ParameterA
  3. 的值

    因此,您声明的函数将立即执行,并将ParameterB作为ParameterA的值传递。

    jQuery || myFunc块意味着:使用jQuery作为参数,除非未定义,在这种情况下使用myFunc

    修改

    这通常在定义jQuery插件时使用,以避免在使用多个javascript库时与$变量发生冲突。因此,您可以将插件定义设置为接受$作为参数的函数,您将立即执行该函数,并将jQuery作为值传递给$

    示例(来自jQuery docs):

    (function( $ ){
      $.fn.myPlugin = function() {
        // Do your awesome plugin stuff here
      };
    })( jQuery );
    

    上述代码块的结果将是一个插件定义,保证$将成为jQuery的别名。

答案 3 :(得分:0)

ParameterA引用在ParameterB中传递的值。这样:

(function (<ParameterA>) {

})(<ParameterB>);

有点像这样:

function test(<ParameterA>) {

}

test(<ParameterB>);

不同之处在于,您使用闭包在全局命名空间中没有冲突的函数。

第二部分:||工作有点像param = jQuery ? jQuery : myFunc。如果定义了jQuery,则传入jQuery;如果不是,则传递给myFunc。

答案 4 :(得分:0)

第一部分:

(function (<ParameterA>) {

})(<ParameterB>);

这意味着函数外部的ParameterB变量将在函数内部称为ParameterA。这被称为自执行函数,因为函数在定义后立即被调用。这意味着您可以在函数内部使用ParameterA,而不会覆盖函数外部的变量。

例如:

(function($){

})(jQuery);

这意味着您可以将$作为函数外部的Mootools和其中的jQuery。

第二部分:

})(jQuery || myfunc);

如果该变量存在,则调用传递jQuery变量的函数,如果不存在,则调用myfunc。我不太清楚为什么要这样做......