代码之家  ›  专栏  ›  技术社区  ›  chrisl-921fb74d

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

  •  2
  • chrisl-921fb74d  · 技术社区  · 15 年前

    (function (<ParameterA>) {
    
    })(<ParameterB>);
    
    1. 我知道参数A用于指定函数的范围,这是真的吗?
    2. 参数b是导出函数的位置吗?

    最后,我经常看到以下脚本:

    })(jQuery || myfunc);
    

    这是否意味着他们正在导出或返回这些对象?使用这两个管道有什么意义?这是场上的进球吗?

    5 回复  |  直到 15 年前
        1
  •  4
  •   Dave Aaron Smith    15 年前

    参数A没有指定函数的作用域。函数的位置决定了函数的范围。ParameterB不是导出函数的位置。事实上,按照这种设置方式,在任何地方都没有指向函数的指针,这使得函数成为“匿名函数”。换句话说,函数本身是不可导出的。通常,当你谈到导出时,你指的是导出你在匿名函数中定义的变量。例如,我在这里导出函数 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 .

    (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”的意思是 ,不管怎样 是的。”

    编辑

    })(); 这个 () 使匿名函数运行。请记住,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();
    
        2
  •  3
  •   John G    15 年前

    1. ParameterA 是您正在声明的匿名函数的参数
    2. ParameterB 是你传递给别人的价值 参数

    所以您声明的函数将立即执行,传递 作为 参数

    这个 jQuery || myFunc block的意思是:使用 jQuery 作为参数,除非未定义,在这种情况下使用 myFunc

    编辑:

    这通常在定义jQuery插件时使用,以避免与 $ 变量(如果正在使用多个javascript库)。所以你可以让你的插件定义成为一个接受 $ jQuery公司 作为 $ .

    示例(来自jQuery文档):

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

    上述代码块的结果将是一个插件定义,其中您可以保证 将成为的别名 .

        3
  •  3
  •   Gopherkhan    15 年前

    YAHOO.util.Event passed in作为参数b,可用作“ e “in ParameterA.)这样,在匿名函数中,就不会键入完整的命名空间路径。[我知道你是一个jquery人,但是yahoo名称空间更长,并且更好地说明了这一点:)]或者,你可以在函数内部的var中手动存储引用。

    jquery || myFunc 语法是“如果jquery是truthy/available,则使用jquery;如果jquery不是truthy/available,则使用myFunc”的缩写。

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

    这是因为javascript允许错误的值计算,而不将对象完全转换为布尔值。即:未定义是错误的,“”是错误的,空是错误的。

    另一种方法可用于检测方法或属性是否在&中可用;。

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

    只有当此人有父项,且其父项有父项时,才会定义此项。如果在最后一条语句之前出现任何错误,都将导致未定义祖父母。

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

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

        4
  •  0
  •   treeface    15 年前

    ParameterA正在引用在ParameterB传入的值。这:

    (function (<ParameterA>) {
    
    })(<ParameterB>);
    

    有点像这样:

    function test(<ParameterA>) {
    
    }
    
    test(<ParameterB>);
    

    不同之处在于,这样您就可以使用闭包来避免在全局命名空间中有冲突的函数。

    param = jQuery ? jQuery : myFunc . 它在jQuery中传递(如果已定义),或者在myFunc中传递(如果未定义)。

        5
  •  0
  •   lonesomeday    15 年前

    第一部分:

    (function (<ParameterA>) {
    
    })(<ParameterB>);
    

    ParameterB 功能之外的将被称为 ParameterA 在函数内部。这称为自执行函数,因为一旦定义了函数,就会立即调用它。意思是你可以用 在函数中不重写函数外存在的变量。

    (function($){
    
    })(jQuery);
    

    这意味着你可以 $ 例如,作为函数外部的Mootools和作为函数内部的jQuery。

    第二部分:

    })(jQuery || myfunc);
    

    jQuery 变量是否存在,以及 myfunc 如果没有。我不知道你为什么要这么做。。。