JavaScript是否为函数范围中声明的项具有变量?

时间:2013-05-16 03:33:56

标签: javascript

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 个答案:

答案 0 :(得分:3)

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

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

重复Javascript: Get access to local variable or variable in closure by its nameHow can I access local scope dynamically in javascript?Javascript local variable declare

答案 1 :(得分:2)

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

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

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

如果您确实需要隐藏这些属性,可以将它们隐藏在闭包中,如下所示:

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

答案 2 :(得分:1)

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

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

a.testingVar = "asdf";

a();

DEMO: http://jsfiddle.net/gEM7W/

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

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

a();

DEMO: http://jsfiddle.net/gEM7W/1/

答案 3 :(得分: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; }
    };
};

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

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

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

现在一切都是私人的,我甚至不需要申报任何东西 只要有一个可公开访问的函数返回,Closure就会保持对象的运行,该函数仍然可以访问函数调用的特定实例。

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