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

时间:2014-11-19 00:02:33

标签: javascript properties closures ecmascript-6

是否可以实现迭代它自己的不使用弃用的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);

我在“iterate”中设置了一个断点并在调试器中查找并且无法弄清楚如何访问其他变量名。此外,在数十次Google搜索之后,我无法找到答案,因为搜索点击通常是指外部而非内部视角。

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

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

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

您可能还想查看Underscore.js,其中包含 ton 有用的快捷方式,以及许多类似的任务。

更新

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

答案 2 :(得分:0)

尝试

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)