为什么需要这种模式?

时间:2014-03-22 16:19:44

标签: javascript

查看ryanve response.js的代码,它从以下内容开始:

(function(root, name, make) {
  var $ = root['jQuery'] || root['Zepto'] || root['ender'] || root['elo'];
  if (typeof module != 'undefined' && module['exports']) module['exports'] = make($);
  else root[name] = make($);
}(this, 'Response', function($) {
...

这叫做什么,为什么它有用,它究竟做了什么?

3 个答案:

答案 0 :(得分:3)

此:

(function(root, name, make){...})(this,'Response', function($){...});

调用“init”函数传递默认命名空间(this在浏览器中为window)引用为root变量。

此:

var $ = root['jQuery'] || root['Zepto'] || root['ender'] || root['elo'];

获取jQuery或Zepto等的参考...模块。

而且:

if (typeof module != 'undefined' && module['exports']) 
  module['exports'] = make($);
else 
  root[name] = make($);

检查文件是否加载了可用的模块对象(很可能是CommonJS环境)并调用“constructor”make()并将其排气作为模块注册。 否则将make()结果注册为全局命名空间(root[name] = ...

中的对象

答案 1 :(得分:0)

这是一种钩子。这正是您可以添加当前插件名称“Response”与任何提到的库,如"jQuery, Zepto, ender, elo"。并且“响应”再次留下锚点 在以下代码中。

if (typeof module != 'undefined' && module['exports']) module['exports'] = make($);
else root[name] = make($);

自编代码需要一些改动。让我们把jQuery,"this"引用window,基于作者试图喜欢window.jQuery.Response = function(jQuery){}的代码和“if”条件中的模块是全局的。当您使用像环境这样的NodeJ时,它将可用。在这种情况下,Response附加了该全局变量,而不是jQuery。

注意:我们可以说,“响应”定义可以与任何提及“模块”全局的提及库和/或库一起使用。

答案 2 :(得分:0)

此模式有助于避免在全局范围内编写代码,并且编写在代码第一行的函数是自调用函数。一旦声明了自调用函数,就会调用它。这是怎么做的。

(function(argument1, argument2, argument2){
    alert("Self invoked");
})(arg1, arg2, arg3);

在你的情况下,第一个参数是this,它引用window对象,第二个是字符串,第三个是回调。