2

我对我不断看到的常见模式的情况感到有些困惑。它通常看起来像这样。

(function( w ){
    w.functionName = function(){

      // Function stuff, blah blah blah

    };
  }( this ));

我看到的另一个常见的看起来像:

(function( $ ){
    $.fn.functionName = function(){

    // Function stuff, blah blah blah

    };
}( jQuery ));

我对匿名函数有些熟悉,虽然我很好奇,w 是什么,它的用途是什么?

匿名函数末尾出现this/jquery的原因是什么。

感谢您对此的所有反馈!我感谢所有的回应。

4

4 回答 4

1

w只是函数参数的正式名称(正常的事情,在这个例子中,实际参数是thisor jQuery)。我不知道为什么这个给定示例中的 jQuery 会这样做,可能它被认为是一种很好的初始化。

例子:

var obj={'x':1};
console.log(obj.x);//1

(function(p){
    p.x=5;
})(obj);

console.log(obj.x);//5
于 2013-01-05T23:36:30.530 回答
1

此模式用于在 JavaScript 中创建范围。它被称为立即调用函数表达式 (IIFE)。传递参数以确保它们具有正确的值,以防以后重新定义全局引用。

使用此模式的另一种常见方式也是使用undefined参数。

(function ($, undefined) {
   // ...
})(jQuery);
于 2013-01-05T23:42:01.057 回答
1

您在 jQuery 插件中看到这一点的主要原因之一是与$其他使用它的库隔离,例如 Mootools 或原型

在 jQuery 案例中.. 有一个名为的参数$并将(jQuery)jQuery 对象传递给自执行函数。

然后,当您$在函数中使用它时,它已经被定义为允许您编写的 jQuery 对象$.doStuff()

使用这个绝缘实例$不是$jQuery 在加载时创建的全局实例,因此如果另一个使用$别名的库就位,则$内部自执行函数与全局绝缘$避免冲突。jQuery.noConflict()如果您在代码中的其他地方使用,情况也是如此

于 2013-01-05T23:44:01.257 回答
1

这是“立即调用函数表达式”(IIFE) 的一个示例。

在Addy Osmani的在线书籍Learning JavaScript Design Patterns中, Namespacing Patterns部分涵盖了 IIFE。

为了回答这种常见模式的用途,我引用了书中的一些引述:

在本书的前面,我们简要介绍了 IIFE(立即调用函数表达式)的概念,它实际上是一个未命名函数,在定义后立即调用。

在 JavaScript 中,因为在这种上下文中显式定义的变量和函数都只能在其中访问,所以函数调用提供了一种实现隐私的简单方法。

IIFE 是一种流行的封装应用程序逻辑的方法,以保护其免受全局命名空间的影响,但在命名空间领域也有它们的用途。

我建议你看看这本书——它还涵盖了其他有用的模式,比如模块模式。

于 2013-01-05T23:45:11.707 回答