我正在学习JavaScript,目前我无法理解的是下面这个例子。使用in
检查右侧对象中是否存在项目。
此代码会将用户选项合并为默认选项。
令我感到困惑的是i
未在任何地方定义,那么它如何知道i
是什么?
如果我在i
块内打印出for
,则会列出我对象的每个option
。
我已阅读MDN's article about the in
operator,但它没有解释这种未定义变量的处理。
var i;
for(i in options) {
if(i in this.options) {
this.options[i] = options[i];
} else {
throw new Error("Notice doesn't support option: " + i);
}
}
答案 0 :(得分:2)
有两种不同的“in”:
代码中的第一个in
不是in
运算符。它是一个For ... in循环,它遍历一个对象的键,将每个键分配给变量,在本例中为i
。
您的代码中的第二个in
是您已经阅读过文档的oner。返回true或false的运算符。
注意:除非您在该函数范围中有var i
,否则您要在循环中省略i
关键字来声明全局变量var
。你最想要的是:
for(var i in options){
答案 1 :(得分:2)
这不是for ... in
运算符特有的结果。
每次尝试分配给未定义的变量时,都会creates a global variable of that name。全局变量是window
对象的属性,因此您可以按如下方式观察此行为:
for (i in [0]) {
alert(window.i); // displays "0"
}
i = 0
alert(window.i); // displays "0"
然而,这被认为是语言中令人遗憾和令人困惑的错误特征;大多数情况下,您不需要或不需要全局变量。强烈建议不要依赖此行为,并且'use strict'
将var i
作为函数脚本的第一行,它甚至无法正常工作。
在第一次分配变量之前或之后,您应始终使用for(var i in options) {
if(i in this.options) {
this.options[i] = options[i];
} else {
throw new Error("Notice doesn't support option: " + i);
}
}
来声明变量。
{{1}}
答案 2 :(得分:1)
让我感到困惑的是
i
没有在任何地方定义,所以如何定义 它知道i
是什么?
你可以做这样的事情
for(var i in options) {
if(i in this.options) {
this.options[i] = options[i];
} else {
throw new Error("Notice doesn't support option: " + i);
}
}
现在正在定义。
进一步解释
for(<variable to hold the value on every loop> in <collection>)
JavaScript for/in statement
循环遍历对象的属性