【问题标题】:JavaScript: Is it possible to iterate your OWN variables?JavaScript:是否可以迭代您的 OWN 变量?
【发布时间】:2014-11-19 00:02:33
【问题描述】:

是否可以实现“迭代”函数(如下)来迭代它自己的不使用已弃用 JavaScript 功能的变量?

(function () {
    var a = 1;
    var b = 2;
    var iterate = function () {
        var k;
        for (k in this) {     //WRONG IMPLEMENTATION!
            alert(this[k]);
            // a
            // b
            // iterate
        }
    };
}).call(this);

我在“迭代”中设置了一个断点,并在调试器中四处寻找,但无法弄清楚如何访问其他变量名。此外,在 Google 搜索了几十次之后,我一直无法找到答案,因为搜索结果通常指的是外部而非内部视角。

更新:我把属性和变量弄糊涂了。在编辑之前,最初的问题是询问迭代属性。我现在意识到这些都是变量。

【问题讨论】:

标签: javascript properties closures ecmascript-6


【解决方案1】:

没有。除了可怕的eval hack,您无法以动态方式访问除全局范围 (window) 或对象范围 (this) 之外的任何范围内的变量。

但你不需要!如果您想动态访问这些变量,请将它们存储在一个对象中:

var data = {
    a: 1,
    b: 2
};

【讨论】:

  • 谢谢,是的,我意识到我可以创建一个本地对象,也许可以使用像“o”这样的短名称并像 o.a 和 o.b 一样访问。我希望消除 o. 范围语法。看来我倒霉了。
【解决方案2】:

我相信你想要hasOwnProperty。每个对象都有这个方法,您可以通过它传递一个属性名称(即,您从使用 for 循环迭代获得的名称)并了解该属性是否设置在给定对象上(因此不被继承)。所以,例如:

for (var k in this) {
    if (this.hasOwnProperty(k)) {
        // do something here...
    }
}

您可能还想查看 Underscore.js,它有 大量 用于此任务和许多类似任务的有用快捷方式。

更新

我想我可能误解了这个问题...如果您想知道是否有一种方法可以遍历所有范围内的变量,那么:不,没有。

【讨论】:

    【解决方案3】:

    试试

    var j = (function (obj) {
    
            var a = 1;
            var b = 2;
    
            var iterate = function () {
                var k;
                for (k in this) {     
                    console.log(k, this[k]);
                };
            }.bind(obj);
             obj["a"] = a; obj["b"] = b; obj["iterate"] = iterate;
    
           return obj
        }(Object.create(null))) || obj;
    

    var j = (function (obj) {
            
            var a = 1;
            var b = 2;
            
            var iterate = function () {
                var k;
                for (k in this) {     
                    console.log(k, this[k]);
                };
            }.bind(obj);
             obj["a"] = a; obj["b"] = b; obj["iterate"] = iterate;
            
           return obj
        }(Object.create(null))) || obj;
        
        j.iterate();
        j.a = 5;
        j.iterate();
        console.log(j)

    【讨论】:

    • 看起来理论上可行,但并不“方便”。目标是在不显式编程变量名称的情况下进行迭代。但是感谢您提供解决方案!
    猜你喜欢
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多