这个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还需要“它所代表的模式”