这个javascript函数是如何调用的,它使用的是什么模式?

这个javascript函数是如何调用的,它使用的是什么模式?,javascript,closures,Javascript,Closures,我在一个示例代码中遇到了这种类型的函数,它看起来被广泛使用。但我不知道如何称呼它,或者说实际上它代表了什么样的模式 l = function (a1){ someVar = { someFn: function(a2){ console.log(a1); console.log(a2); } } } 我该如何着手执行某件事fn?这与闭包有关吗 更新: 这就是代码的使用方式。正如@joseph the dreamer猜测的,它被用作模块的一部

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

 l = function (a1){
  someVar = {
    someFn: function(a2){
       console.log(a1);
       console.log(a2);
    }
  }
}
我该如何着手执行某件事fn?这与闭包有关吗

更新:

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

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

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

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

var someVar;

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

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

//1
//2
您还可以访问
someVar
。请注意,这次,
someVar
l
中的局部变量

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

l(1).someFn(2);

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

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


否则,如果您确实有权访问
someVar
,则可以像这样调用
someVar.someFn()
注意在这种情况下,
控制台.log(a1)
的行为会很奇怪,因为自从上次调用
l()
以来,
a1
才被赋值。

在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

如果
someVar
l
的赋值上面声明了怎么办?有没有办法不用使用全局变量就可以做到这一点?@pinkparter@JosephDreamer op还需要“它代表什么模式”。感谢您的生命!正是我需要的。确切地说,这来自@derrick bailey木偶实现。在其当前状态下,如果没有任何
someVar
声明,调用
l
将生成一个全局
someVar
。“你仍然可以用某种方式访问它。”约瑟夫德雷默——我不认为你说的是真的。尝试使用
alert(typeof someVar)运行上述代码在它之后。你得到了
未定义的
@josephdreamer-My bad;)忘记运行
l()
first:)。运行
l()
是此隐式全局声明为真所必需的。
由于a1当时未在任何作用域中声明。
这不是真的,由于调用了
l()
@Chad,因此它在闭包作用域中。如果以前调用过
l()
,则是正确的。我会把那块拿走-谢谢!op还需要“它所代表的模式”