Javascript使用嵌套函数作为访问对象

时间:2013-07-12 11:58:20

标签: javascript function object scope

我写了一个这样的程序:

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”)

谢谢!

2 个答案:

答案 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 不能被修改客户端。