JavaScript:是否可以迭代你的 OWN 变量

JavaScript: Is it possible to iterate your OWN variables?

本文关键字:OWN 变量 迭代 是否 JavaScript      更新时间:2023-09-26
是否可以

实现"迭代"函数(下图),该函数迭代它自己的变量,而不是使用已弃用的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);

我在"迭代"中设置了一个断点,并在调试器中四处寻找,但无法弄清楚如何访问其他变量名称。 此外,经过数十次谷歌搜索,我无法找到答案,因为搜索命中通常是指外部而不是内部视角。

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

No.除了可怕的eval黑客攻击之外,你不能以动态的方式访问任何范围内的变量,除了全局作用域(window)或对象的范围(this)。

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

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

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

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

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

更新

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

尝试

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)