Как называется эта функция javascript и какой шаблон она использует?
Я наткнулся на эту функцию типа в примере кода, и она выглядит широко используемой. Но я не могу понять, как это назвать, или на самом деле, какую модель он представляет.
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);
}
}
})
3 ответа
Из его текущего состояния, вам нужно позвонить 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
от звонка l
чтобы получить доступ 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 и возвращает объект в качестве интерфейса к модулю.
Если someVar
не является переменной в области видимости за пределами l()
, то вы не можете позвонить someFn()
, поскольку someFn()
является частной функцией члена someVar
,
В противном случае, если у вас есть доступ к someVar
тогда вы можете позвонить someFn()
как это someVar.someFn()
, Обратите внимание, что в этом случае console.log(a1)
будет вести себя странно, так как a1
это был назначен только с последнего раза l()
назывался.
В JavaScript есть 2 типа переменных: глобальные и локальные.
//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