了解JavaScript作用域函数的新特性并传递$

了解JavaScript作用域函数的新特性并传递$,javascript,jquery,function,Javascript,Jquery,Function,好的,当涉及JavaScript作用域函数和模块模式时,我肯定学到了很多东西,非常棒的东西!现在,我正在自学如何通过这种方式将jQuery传递到作用域函数中,它可以更快地加载,如果出于某种原因,我有另一个使用$的框架,那么就不会有任何混淆 但我不完全理解的是,当我想传入jQuery时,什么时候在上下文中创建一个“新的”实例“到作用域函数”。这就是我的意思…如果我打算使用以下内容作为基础,它将返回pub,它可以与函数或属性等关联,我明白了 var DemoA = (function($) { va

好的,当涉及JavaScript作用域函数和模块模式时,我肯定学到了很多东西,非常棒的东西!现在,我正在自学如何通过这种方式将jQuery传递到作用域函数中,它可以更快地加载,如果出于某种原因,我有另一个使用$的框架,那么就不会有任何混淆

但我不完全理解的是,当我想传入jQuery时,什么时候在上下文中创建一个“新的”实例“到作用域函数”。这就是我的意思…如果我打算使用以下内容作为基础,它将返回pub,它可以与函数或属性等关联,我明白了

var DemoA = (function($) {
var pubs = {};
pubs.dosomething = //some function that calculates cool stuff with help of jquery
return pubs;
})(jQuery);
现在,当我尝试创建一个新实例时

var stuff = new DemoA();
…我通过Google Chrome开发者工具发现一个错误。它说“对象不是函数”或类似的东西。但是如果我像这样直接给DemoA打电话

DemoA.dosomething();
…然后一切都很好。这是怎么回事?为什么我不能创建一个新的实例变量


提前感谢你帮助我变得更聪明

查看您的
return
语句。您将返回一个如下所示的对象:

{"dosomething": function () { }}
无法创建对象的新实例。您可以直接调用
dosomething
,因为它是返回对象的立即属性(方法)

我想你想要这样的东西:

{"dosomething": function () { }}


这样,您仍然将
jQuery
对象别名为
$
,并返回一个
函数
,该函数可以按您想要的方式使用。

查看
返回
语句。您将返回一个如下所示的对象:

{"dosomething": function () { }}
无法创建对象的新实例。您可以直接调用
dosomething
,因为它是返回对象的立即属性(方法)

我想你想要这样的东西:

{"dosomething": function () { }}


这样,您仍然将
jQuery
对象别名为
$
,并返回一个
函数
,该函数可以按您想要的方式使用。

只是一个更复杂的jQuery示例,通常使用:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
(function($) {

  $.DemoA = function(element, options) {
    var pubs = {};
    return pubs;
  }

  $.fn.DemoA = function(options) {
     return this.each(function() {
       (new $.DemoA($(this), options));
     });
   };

})(jQuery);

var i = new $.DemoA(item, {});
var j = $('<div>').DemoA();
</script>

(函数($){
$.DemoA=函数(元素、选项){
var pubs={};
返回酒吧;
}
$.fn.DemoA=函数(选项){
返回此值。每个(函数(){
(新的$.DemoA($(本),选项));
});
};
})(jQuery);
var i=新的$.DemoA(项目{});
var j=$('').DemoA();

只是一个比较复杂的jQuery示例,通常使用:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
(function($) {

  $.DemoA = function(element, options) {
    var pubs = {};
    return pubs;
  }

  $.fn.DemoA = function(options) {
     return this.each(function() {
       (new $.DemoA($(this), options));
     });
   };

})(jQuery);

var i = new $.DemoA(item, {});
var j = $('<div>').DemoA();
</script>

(函数($){
$.DemoA=函数(元素、选项){
var pubs={};
返回酒吧;
}
$.fn.DemoA=函数(选项){
返回此值。每个(函数(){
(新的$.DemoA($(本),选项));
});
};
})(jQuery);
var i=新的$.DemoA(项目{});
var j=$('').DemoA();

使用闭包仅仅存储一个可以传递给实例的变量,或者仅仅引用或“别名”为
$=jQuery
似乎不合适。@RobG这怎么不合适?在创建jQuery插件时,这是很常见的,主要是为了确保它能够工作,即使有另一个类库原型使用
$
作为其标识,因为它创建的闭包不需要闭包。只需在函数中赋值
var$=jQuery
,就可以在没有闭包的情况下执行相同的操作。仅仅因为某些东西很普通,并不意味着它适合于特定的情况。@RobG那么jQuery插件为什么要这样做呢?他们为什么不照你说的去做呢?如果他们花时间评估他们的特殊情况,了解选择和后果,然后选择最合适的方法,也许会有更多不同的方法。但是我怀疑他们只是做了其他人做的事情(或者没有“最佳”的理由),然后声称(或者如果你喜欢花哨的名字)是“最佳实践”。使用闭包只是为了存储一个变量,这个变量可以传递给实例,或者只是引用或“别名”为
$=jQuery
似乎不合适。@RobG这怎么不合适呢?在创建jQuery插件时,这是很常见的,主要是为了确保它能够工作,即使有另一个类库原型使用
$
作为其标识,因为它创建的闭包不需要闭包。只需在函数中赋值
var$=jQuery
,就可以在没有闭包的情况下执行相同的操作。仅仅因为某些东西很普通,并不意味着它适合于特定的情况。@RobG那么jQuery插件为什么要这样做呢?他们为什么不照你说的去做呢?如果他们花时间评估他们的特殊情况,了解选择和后果,然后选择最合适的方法,也许会有更多不同的方法。但我怀疑他们只是做了其他人都做的事情(或者没有“最佳”的理由),然后声称(或者如果你喜欢花哨的名字)“最佳实践”。