5

我在示例代码中遇到了这种类型的函数,它看起来被广泛使用。但我不知道如何称呼它,或者事实上,它代表什么模式。

 l = function (a1){
  someVar = {
    someFn: function(a2){
       console.log(a1);
       console.log(a2);
    }
  }
}

我将如何执行 someFn?这与闭包有关吗?

更新:

这就是代码的使用方式。正如@joseph-the-dreamer 猜测的那样,它被用作模块的一部分,其中:

  App.module("Module", function(a1) {
      someVar = {
        someFn: function(a2){
           console.log(a1);
           console.log(a2);
        }
      }
  })
4

3 回答 3

7

从它的当前状态来看,您需要先调用l以设置someVar为 access someFn。否则根本无法访问someFn

但是如果没有任何变量声明someVar,调用l将创建一个隐含的 global someVar。隐含的全局变量不是一个好习惯。你应该someVar在某个地方声明,即使你的意思是它是一个全局的。

var someVar;

l = function (a1){
  someVar = {
    someFn: function(a2){
       console.log(a1);
       console.log(a2);
    }
  }
}

l(1);
someVar.someFn(2);

//1
//2

您也可以从调用返回someVarl访问someVar。请注意,这一次,someVar是 中的局部变量l

var l = function (a1){
  var someVar = {
    someFn: function(a2){
      console.log(a1);
      console.log(a2);
    }
  }
  return someVar;
}

l(1).someFn(2);

至于模式,我认为你所拥有的是模块模式的不完整形式。通常,模块模式将事物包装在IIFE中,并返回一个对象作为模块的接口。

于 2013-06-09T04:40:48.977 回答
1

如果someVar不是 范围外的变量l(),则不能调用someFn(),因为someFn()是 的私有成员函数someVar

否则,如果您确实可以访问someVar,那么您可以someFn()像这样调用someVar.someFn()请注意,在这种情况下,console.log(a1)will 的行为很奇怪,因为a1is 仅在上次l()调用后才被分配。

于 2013-06-09T04:41:35.203 回答
0

在 JavaScript 中有两种类型的变量:全局变量和局部变量。

//local
var foo = "foo";

//global
bar = "bar";

从我在您的示例中看到的,l是一个用于存储匿名函数的全局变量。在这个函数内部有一个名为的全局变量someVar存储一个对象,该对象具有一个名为someFn存储匿名函数的局部变量。

要执行someFn,您必须执行以下操作:

l("Foo");               //This does not output anything
someVar.someFn("Bar");  //This will output "Foo" and then "Bar"

当您调用时l("Foo");,您正在创建全局变量someVar。这反过来意味着您可以someVar在任何地方使用,甚至可以在存储在l. 您正在为参数使用闭包a1

全局变量可以在任何地方使用,我谦虚地建议限制它的使用,因为它会污染全局范围,这意味着它很容易出错。

不使用全局变量的方法会更好。这里的小例子:

"use strict";

var l = function(a1) { //constructor
  var _a1 = a1; //private variable
  this.someFn = function(a2) { //public method
     console.log(_a1);
     console.log(a2);
  };
};

var object1 = new l("Foo");
var object2 = new l("Foo");
object1.someFn(1); //outputs "Foo" and then 1
object2.someFn(2); //outputs "Foo" and then 2
于 2013-06-09T05:05:00.307 回答