1

我写了一个这样的程序:

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”)。a 内部也有变量,可以由 b、c、d、e 和 f 访问(同样,本地声明,不使用“this”)

谢谢!

4

2 回答 2

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
于 2013-07-12T12:25:13.573 回答
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.

    };

}());

这对于您正在尝试做的事情可能有点矫枉过正,但是关闭的好处是您的全局变量globalOneglobalTwo不能被客户端修改。

于 2013-07-12T12:20:53.367 回答