【问题标题】:Understanding JavaScript functions and plugins set up了解 JavaScript 函数和插件设置
【发布时间】:2012-10-24 22:40:36
【问题描述】:

一段时间后我才刚刚开始编写 JavaScript,我对插件构造函数的设置感到困惑。我通过此链接寻求建议。

What does the exclamation mark do before the function?

我有兴趣了解此功能设置..

我见过下面三个这样的例子:

(function(parameterOne, parameterTwo) {

    functionOne = function(...) {
       ...
   },

   functionTwo: new function() {
   },

   this.functionThree = function(...) {
   }

})()

我的问题如下:

  1. 什么时候使用给定的函数一、函数二和函数三的构造?如何显式调用 functionOne、functionTwo 或 functionThree?

  2. 我见过这样的函数:

    (function(parameter) {
    
        functionFour = function(..) {
       },
       ....
    })(document)
    

本例中的文档表示什么?这个问题我困惑了很久。

  1. 我见过遵循这种结构的 jQuery 插件吗?

    (function($) {
    
      $.fn.myCustomPlugin: function(...) {
      }
    })(jQuery)
    

为什么$传给函数,jQuery最后传?我很抱歉,因为这对你们中的一些人来说可能是基本问题,但这些问题已经困扰了我几个星期,我迫切希望得到任何答案。

谢谢,

卡提克

【问题讨论】:

标签: jquery-plugins javascript


【解决方案1】:

(function(parameterOne, parameterTwo) {

没有意义,因为您最终没有传递这些参数。此外,看起来您正在立即尝试创建匿名代码块 - 在某些情况下是有意义的,但您不需要这样做,除非您试图保护全局范围免受此代码块内发生的任何事情的影响。

    functionOne = function(...) {
       ...
   },

这是一个类似于var functionOne 的命名函数,仅在父函数或构造函数内部有用。

   functionTwo: new function() {
   },

更新:当您尝试在此处创建实例时,这真的没有意义。您绝对可以立即实例化您在该函数声明中拥有的内容(这与先声明 func. 然后使用运算符 new 相同),但在这种情况下,您得到的是对象而不是函数。试试:

var f = function() {};
console.log(f); // "function"
var f = new function() {}
console.log(f); // "objest"

那个对象是你的构造函数的实例。

   this.functionThree = function(...) {
   }

这是一个类的方法。使用运算符new 实例化类后,您可以从实例外部访问它。此外,当您在类中使用this. 时,请记住,每次实例化一个类时,它都会为该值保留内存。当这些实例的变量不同时没关系,但如果它是一个方法,你最好将它添加到构造函数原型中,这样它只声明一次并且不会为它保留新的内存块。

})()

这里你通常会在里面传递你请求的参数,例如parameterOne, parameterTwo

(function(parameter) {

    functionFour = function(..) {
   },
   ....
})(document)

这是一种将上下文或任何对象传递给此匿名代码块的方法。在这种情况下,它看起来像一个接受 window.document 的插件,但它也可以接受 DOM 的任何其他部分。例如,如果你想选择所有标签a并接收document作为参数,它将遍历window.document中的所有链接,但是如果你传递$('#somediv'),这个插件将只遍历div内的链接这个id。

(function($) {

  $.fn.myCustomPlugin: function(...) {
  }
})(jQuery)

这是确保代码中 $ 是一个 jQuery 对象的好方法。问题是,例如在 Chrome 中已经有一个原生函数 $,或者在一些生产站点中 $ 可能是一个 Prototype JS 函数。但是在里面的例子中,你要确保 var $ 不是原生的 $ 或者不是 Prototype。

一般来说,你不应该随意使用(function() {...})()——这只是在我上面提到的保护全球环境的特定情况下使用。

【讨论】:

  • 我的示例可能错误或不正确,因为我不太了解 JavaScript。我边走边学,但这就是我问这个问题的原因。
  • 我明白了,我并没有批评的意思,我只是在解释你得到了什么:)
  • 请问如果可能的话,我将如何调用函数 functionOne、functionTwo 和 functionThree?
  • 如果在函数名后使用()调用函数,例如functionOne() 并使用 callapply 方法。你可以通过关键字new获取一个函数的实例,它是一个JS对象。请记住,这样做得到的是一个对象,而不是一个函数。在您的示例中,所有这些调用都是相同的——functionOne(args)functionTwo.call(args)this.functionThree.apply(args)
猜你喜欢
  • 2011-11-11
  • 2013-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多