我写了一个这样的程序:
function a(x,y,z) {
function b(foo,bar) {};
function c(foo,bar) {};
function d(foo,bar) {};
function e(foo,bar) {};
function f(foo,bar) {};
}
我用这种方式调用函数:
for(var i=0; i<5; i++) { charts[i] = a(x[i],y[i],z[i])}
x,y和z是长度为5的全局数组和一些属性。
现在,循环在页面加载之前执行,每个数组的所有函数也按预期执行(事件监听器绑定到这些函数中的元素)
假设我想在页面加载后从b,c,d,e或f“访问一些局部变量,当调用一个事件时,我该怎么办?我想在这里谈论“范围”。
我是否必须将整个事物作为对象?
此外,b,c,e和f中有局部变量(本地声明且不使用“this”)。 其中也有变量,由b,c,d,e和f访问(同样,本地声明,不使用“this”)
谢谢!
答案 0 :(得分:2)
您可以在a中简单地创建一个新对象并返回该对象。
var a = function (x, y, z) {
var result = {};
var outerVal = x;
result.b = function (foo, bar) { return foo + bar; };
result.c = function (foo, bar) { return outerVal + result.g + z}; //closure
result.d = function (foo, bar) { };
result.e = function (foo, bar) { };
result.f = function (foo, bar) { };
result.g = y;
//If you want to execute the functions you can do so
result.bValue = result.b(x, y);
result.c(y, z);
return result;
};
var anA = a(1, 2, 3);
console.log(anA.bValue); //3
console.log(anA.b(2, 5)); //7
console.log(anA.c()); //6
答案 1 :(得分:0)
Amberlamps说,你不能从创建它们的范围之外访问局部变量,这意味着你的函数a不能“看到”在b,c,d,e,f中创建的任何变量。您可以创建一些全局变量(全局变为b,c,d,e和f),也可以考虑编写闭包:
var something = (function () {
var globalOne = null,
globalTwo = null;
//...
return {
a: function (x, y, z) {
something.b(foo, bar);
something.c(foo, bar);
},
b: function (foo, bar) {
},
c: function (foo, bar) {
}
// etc.
};
}());
对于你正在尝试做的事情,这可能有点过分,但关闭的好处是你的全局 globalOne 和 globalTwo 不能被修改客户端。