当前位置: 首页 > 面试题库 >

为什么定义一个匿名函数并将jQuery作为参数传递给它?

晁聪
2023-03-14
问题内容

我正在看ribs.js截屏视频中出色的peepcode演示代码。在其中,主干代码全部封装在传递给jQuery对象的匿名函数中:

(function($) {
  // Backbone code in here
})(jQuery);

在我自己的主干代码中,我将所有代码包装在jQuery DOM’ready’事件中:

$(function(){
  // Backbone code in here
});

第一种方法的目的/优势是什么?这样做会创建一个匿名函数,然后立即将jQuery对象作为函数参数传递来执行该匿名函数,从而有效地确保$是jQuery对象。这是唯一的观点-保证jQuery绑定到“ $”还是有其他原因呢?


问题答案:

您显示的两个代码块在执行时间和执行原因上有很大不同。它们不是彼此排斥的。它们的目的不同。

JavaScript模块

(function($) {
  // Backbone code in here
})(jQuery);

这是一个“ JavaScript模块”模式,通过立即调用功能实现。

该代码的目的是为您的代码提供“模块化”,保密性和封装性。

此功能的实现由调用(jQuery)括号立即调用。将jQuery传递到括号中的目的是为全局变量提供局部范围。这有助于减少查找$变量的开销,并在某些情况下允许优化器进行更好的压缩/优化。

立即调用功能会立即执行。功能定义一完成,功能即被执行。

jQuery的“ DOMReady”功能

$(function(){
  // Backbone code in here
});

当DOM准备由您的JavaScript代码操纵时,将执行jQuery的“ DOMReady”函数。

模块中的模块与DOMReady

在jQuery的DOMReady函数中定义Backbone代码是一种不好的形式,并且可能会损害您的应用程序性能。在DOM加载并准备好操作之前,不会调用此函数。这意味着您要等到浏览器至少解析一次DOM之后再定义对象。

最好在DOMReady函数之外定义Backbone对象。除其他外,我更喜欢在JavaScript模块模式内执行此操作,以便为代码提供封装和隐私。我倾向于使用“显示模块”模式(请参见上面的第一个链接)来提供对模块外部所需位的访问。

通过在DOMReady函数之外定义对象并提供引用它们的方式,可以使浏览器抢先处理JavaScript,从而有可能加快用户体验。这也使代码更加灵活,因为您可以随意移动事物,而不必担心在移动事物时创建更多的DOMREady函数。

即使您在其他地方定义了Backbone对象,您仍然可能仍将使用DOMReady函数。原因是许多Backbone应用程序需要以某种方式操作DOM。为此,您需要等待DOM准备就绪,因此,在定义应用程序之后,需要使用DOMReady函数来启动您的应用程序。

您可以在网上找到很多这样的示例,但这是一个非常基本的实现,同时使用Module和DOMReady函数:

// Define "MyApp" as a revealing module

MyApp = (function(Backbone, $){

  var View = Backbone.View.extend({
    // do stuff here  
  });

  return {
    init: function(){
      var view = new View();
      $("#some-div").html(view.render().el);
    }
  };

})(Backbone, jQuery);



// Run "MyApp" in DOMReady

$(function(){
  MyApp.init();
});


 类似资料:
  • 问题内容: 我已经熟悉Android框架和Java,并希望创建一个通用的“ NetworkHelper”类,该类可以处理大多数联网代码,使我能够从中调用网页。 我遵循了来自developer.android.com的这篇文章来创建我的网络类:http : //developer.android.com/training/basics/network- ops/connecting.html 码:

  • 问题内容: 当我定义一个自定义类型时,基础类型的类型似乎对我是否可以按原样将其传递给函数还是需要对其进行转换有所不同。 问题是: 为什么和起作用,但不起作用? https://play.golang.org/p/buKNkrg5y- 在这里,当我运行此函数时,它会抱怨,尽管它是基础类型。但是当我打电话或他们成功运行时。 问题答案: 和 您的新类型是2种不同的不同类型。在预期的地方,您必须传递typ

  • 问题内容: 我是ajax和回调函数的新手,如果我弄错了所有概念,请原谅我。 问题: 我可以将 回调 函数作为参数发送给将执行该回调的另一个函数吗? 问题答案: 对。函数引用与任何其他对象引用一样,您可以将它们传递到您的内心。 这是一个更具体的示例: 您还可以传递以下参数:

  • 问题内容: 如何在不执行“父”函数或不使用函数的情况下将函数作为参数传递?(因为我已经读到它是不安全的。) 我有这个: 它可以工作,但是问题是在调用函数时触发,而不是在函数中使用时触发。 根据我所读的内容,我可以使用来解决它,但这不是最佳实践。如何在JavaScript中将函数作为参数传递? 问题答案: 您只需要删除括号: 然后,这将传递函数而不先执行它。 这是一个例子:

  • 问题内容: 我有3类调用,和。 在我的课程中,我想要一个这样的方法: 因此,例如,我想: 如何将类名作为参数,并基于该类名从类名创建适当的对象? 问题答案: 使用反射是可能的。这里是给定的className(作为字符串传递)。此类将在内存中搜索(应该已经加载)。 作为字符串传递时要实例化的类的名称应 完全限定

  • 我试图学习功能性Kotlin,并编写了以下测试代码: 在REPL中,我可以成功调用“findBorrowerX”: 但是我如何拨打“findBorrowerX2”的电话: 并将迭代的借用器x传递给getName?? 这看起来有关联,但我不确定: Kotlin:如何将一个函数作为参数传递给另一个? 提前感谢您对此的帮助! 编辑: 下面是我想做的等效Scala代码: 也许这在科特林是不可能的?