0

JavaScript 是否为函数范围内声明的项目提供了变量?我想访问使用关联数组在函数内声明的项目。

例如,我可以对全局范围内的项目执行以下操作

    var globalVar = "hi";
    var myFunction = function () {
        alert(window["globalVar"]);
    };

但我想对函数内声明的变量做类似的事情

    var myFunction = function () {
        var funcVar = "hi";
        alert(func["funcVar"]);
    };

我意识到做这样的事情不一定是一件好事,我正在做下面的事情,但我仍然对 JavaScript 是否有这样的变量感兴趣。

    var myFunction = function () {
        var func = {funcVar : "hi" };
        alert(func["funcVar"]);
    };
4

4 回答 4

3

这个问题已经被问过并回答了很多次。不,在 JavaScript 中没有包含局部变量作为属性的局部对象(例如,在浏览器环境中,window对象包含全局变量作为属性)。

根据您要完成的任务,可能有许多替代方法可以攻击它,包括您现在使用的方法。

Javascript的重复:通过名称访问局部变量或闭包变量如何在javascript中动态访问局部范围?, Javascript 局部变量声明

于 2013-05-16T04:02:22.757 回答
2

也许您可以将属性分配给函数对象本身,并引用它们?

var myFunction = function() {
    myFunction.funcVar = 'hi';
    alert(myFunction['funcVar']);
};

这不完全是您问题的答案,但这是我能想到的将局部变量作为对象属性访问的最佳方式。请注意,在此方法中,这些变量将以相同的方式在函数外部可见(即查找函数的属性)。

如果你真的需要隐藏这些属性,你可以将它们隐藏在一个闭包中,如下所示:

var myFunction = function() {
    (function hidden() {
        hidden.funcVar = 'hi';
        alert(hidden['funcVar']);
    })();
};
于 2013-05-16T03:54:42.920 回答
1

函数只是可以调用的特殊对象。您可以设置函数的属性,并在以后获取它们。

var a = function () {
    alert(a.testingVar);
};

a.testingVar = "asdf";

a();

演示:http: //jsfiddle.net/gEM7W/

虽然我没有看到理由/需要这样做。您始终可以使用闭包来保留特定于函数的局部变量。例如:

var a = (function () {
    var obj = {
        testingVar: "asdf"
    };
    return function () {
        alert(obj.testingVar);
    };
})();

a();

演示:http: //jsfiddle.net/gEM7W/1/

于 2013-05-16T03:53:38.853 回答
0

你并没有真正的关联数组。你有索引数组,你有对象。

将来,会有一个迭代器可以愉快地遍历两者,没有任何副作用。到那时,也许人们会忘记其中的区别。

但是,这些属性仍然不是基于顺序的:

$arr = array(0, 1, "name"=>"Bob", 3);

在另一种语言中,您可能会得到一个键所在的数组:0, 1, "name", 3
在 JS 中,您会得到0, 1, 2, "name"(或"name", 0, 1, 2)。

所以坚持使用索引数组和具有属性的对象。

也就是说,您有多种选择。

var myFunc = function () {
    var private_data = {
        name : "Bob",
        age : 32
    };

    return {
        getName : function () { return private_data.name; /* or private_data["name"] if that's really what your heart longs for */ },
        get : function (key) { return private_data[key] || null; },
        set : function (key, val) { private_data[key] = val; }
    };
};

现在一切都是私有的,您可以使用点或括号表示法通过属性名称访问它们。

如果它们可以是公共的,并且该函数总是被称为相同的东西(即:不是构造实例的构造函数),那么您可以将自己附加到实际函数:

var myFunc = function () {
    myFunc.name = "Bob";
    myFunc["age"] = 32;


    return {
        get : function (key) { return (myFunc.hasOwnProperty(key)) ? myFunc[key] : null; }
    };
};

缺点(或优点)是myFunc公共名称。因此,这些属性是可公开访问的。

走第一条路,你甚至不需要声明一个变量。您可以只使用传递给函数的对象。

var myFunc = function (dataObj) {
    return {
        getName : function () { return dataObj.name; },
        setAge  : function (val) { dataObj["age"] = val; }
    };
};

var bob = myFunc({ name : "Bob" });
bob.setAge(32);

现在一切都是私人的,我什至不必声明任何东西。
只要返回了一个可公开访问的函数,闭包就会使对象保持运行,该函数仍然可以访问该函数调用的特定实例。

一旦你弄清楚了闭包,这就不成问题了。

于 2013-05-16T04:13:24.483 回答