Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何引用javascript for语句中定义的对象?_Javascript_Foreach - Fatal编程技术网

如何引用javascript for语句中定义的对象?

如何引用javascript for语句中定义的对象?,javascript,foreach,Javascript,Foreach,在Javascript中,“foreach”循环的等价物是: 但是,当for语句本身定义了“b”时,有没有办法做到这一点呢?e、 g for(a in {'a' : 'alpha', 'b' : 'bravo', 'c' : 'charlie'}){ // can I access the alpha, bravo and charlie values here? } 我刚刚在写作中意识到我可以使用: for(var a in b = {'a' : 'alpha', 'b' : 'b

在Javascript中,“foreach”循环的等价物是:

但是,当for语句本身定义了“b”时,有没有办法做到这一点呢?e、 g

for(a in {'a' : 'alpha', 'b' : 'bravo', 'c' : 'charlie'}){
    // can I access the alpha, bravo and charlie values here?
}

我刚刚在写作中意识到我可以使用:

for(var a in b = {'a' : 'alpha', 'b' : 'bravo', 'c' : 'charlie'}){
    // b[a] will now give me the alpha, bravo, charlie values
}
但如果我试图用以下方式声明“b”:

我得到一个语法错误

这意味着我可以这样做,但只能隐式地将b声明为全局。有没有一种方法可以在不创造全球价值观的情况下获取这些价值观

我意识到还有其他更好的方法可以做到这一点(例如,在循环之外定义数组)。出于好奇,我问这是否可行。

您可以用包装来防止创建全局变量

(function () {
    var b = {'a' : 'alpha', 'b' : 'bravo', 'c' : 'charlie'};
    for(var a in b){
        console.log(b[a]);
    }
})();
这表明,不,如果没有在其他变量中对对象的引用,则无法以您希望的方式访问该对象

按照步骤至,您可以看到,对于
for
循环的语句部分中的对象,唯一已知的是下一个可枚举属性的名称,如步骤6a中所定义:

设p为obj的下一个属性的名称,其[[Enumerable]]属性为true。如果没有这样的属性,则返回(normal、V、empty)


要访问有关该对象的任何其他内容,您需要自己对其进行引用。

无论如何,它们都是“全局”的;JS只有函数和全局范围。不相关,但那不是一个数组,它是一个对象。@DaveNewton,如果这部分代码在函数中,
a
将不是全局的,但
b
将是全局的。@DragonRock是的,但因为我们没有关于OP上下文的上下文,我就问题的实际内容发表了评论。@DaveNewton很公平。我假设“隐式声明b为全局”这句话足以表明我在循环范围内寻找一个局部,而不是过于迂腐。@JacobEwing没有“在循环范围内”的局部,JS不会这样做(delta ES6)。OP已经知道这个选项(“我意识到还有其他可能更好的方法可以做到这一点(例如,在循环之外定义数组)。出于好奇,我问这是否可行”)。如果您的答案是,“除了在循环之外声明
b
,没有其他方法,正如您在问题中所建议的,“那么你应该这么说。这不像在循环范围之外定义数组。如果您尝试在函数之后访问b,它将抛出错误。不在循环范围之外(即,包含循环语句的函数),而是在循环之外(即,
for
语句本身)。OP询问是否可以在(…)语句的
括号(可能还有括号)内严格写入任何内容,以便在不创建非局部变量的情况下访问
的右侧。看起来你的方法与OP在问题的最后一段中否定的策略完全一致。我猜这句话“这意味着我可以这样做,但只能隐式地将b声明为全局。有没有一种方法可以访问这些值而不创建全局值?”让我有点困惑bit@memo,嗯,也许我可以说得更清楚些。我在寻找这个PHP代码片段的等价物:foreach(数组('a'=>'alpha','b'=>'bravo','c'=>'charlie')作为$a=>$b){…}
for(var a in var b = {...})
(function () {
    var b = {'a' : 'alpha', 'b' : 'bravo', 'c' : 'charlie'};
    for(var a in b){
        console.log(b[a]);
    }
})();