迭代器范围不是本地的
Iterator scope not local?
我只是在编写两个JavaScript函数,其中一个接受一个长字符串,循环到它到达一个空格,然后调用另一个函数将空格之前的输入打印到DOM中。 然后,第一个函数将继续在空格之后输入,点击空格,调用打印函数等。
在这个过程中,我一直在打无限循环,但前提是字符串包含一个空格。 我不知道为什么,因为所有的循环似乎都设置正确。 我最终发现我的迭代器变量正在将范围从我的第二个函数printMe
跳回第一个函数,readAndFeed
,并且由于函数的设置方式,如果涉及空格,它将始终以低于终止值的数字返回。
第一个函数的循环如下所示:
function readAndFeed(content){
var output = "";
var len = content.length;
for(i = 0; i < len; i++)
{
console.log(i+" r and f increment")
if(content[i] == (" "))
{
printMe(output);
output = "";
}
else if(i==len-1){
output += content[i];
printMe(output)
}
else
{
output += content[i]
}
}
}
第二个函数是 printMe()
,它循环字符串,将其分解为三个位,分别循环每个位(不是以嵌套方式),然后将它们打印到 DOM。 我在其中使用了类似的循环,并且还使用i
作为迭代器。
这将循环没有空格的字符串,但是如果我在其中扔一个空格,浏览器就会崩溃。 我尝试了一堆不同的东西,但最终(通过记录迭代器值)意识到i
出了问题。 有效的方法是将printMe函数中的i
更改为j
。
我很困惑;这似乎不像我理解变量范围的方式。 这些函数是单独定义的,因此似乎迭代器应该是这些函数的本地函数,并且不能从一个函数跳到另一个函数。
这是一个jsfiddle
取消注释底部的"是示例"部分以使浏览器崩溃。 同样,在printMe
函数中将i
变量更改为j
完全解决了这个问题,但是咦?
当你不声明变量时,它是隐式全局的。 由于您尚未声明循环迭代索引i
,因此它是全局的。 如果在多个函数中执行此操作,这些全局变量将发生冲突,一个函数将意外修改另一个函数的变量。
解决方案是确保使用var
声明局部变量,如下所示:
for (var i = 0; i < len; i++) {
在您的情况下,您需要同时修复readAndFeed()
和printMe()
因为它们都有相同的问题,因此它们都尝试使用全局i
。 当你从另一个调用一个时,它会破坏原版对i
的使用。 这是readAndFeed()
的固定版本:
function readAndFeed(content) {
var output = "";
var len = content.length;
// add var here before i
for (var i = 0; i < len; i++) {
console.log(i + " r and f increment")
if (content[i] == (" ")) {
printMe(output);
output = "";
} else if (i == len - 1) {
output += content[i];
printMe(output)
} else {
output += content[i]
}
}
}
如果你在严格模式下运行你的 Javascript 代码,那么尝试使用未声明的变量实际上会导致错误(而不是隐式地使其成为全局变量),所以你不会像这样意外地搬起石头砸自己的脚。
在您的示例中,i
实际上是一个全局变量。任何没有var
语句的赋值都指向未声明的变量,这都会声明一个隐式全局变量。
要使i
本地化,只需包含var
:
for (var i = 0; i < len; i++)
- Babel编译错误:找不到模块核心js/library/fn/get迭代器
- 从两个基于0的for循环迭代器中获取单个基于0的索引的公式
- Rails:试图在javascript(Google Charts API)中嵌入一个adv-ruby(each+迭代器
- 在javascript中,从迭代器创建Array
- Javascript中的迭代器和生成器
- 从迭代器/生成器中获取单个yield值
- 迭代器和可迭代之间的区别
- 文件夹迭代器中的Google驱动器文件迭代器
- DOM:如何根据迭代器值设置元素宽度并在mouseover上调用函数
- javascript中多维数组的迭代器
- 迭代Promise迭代器的非递归方法
- 循环中的Node.js回调具有错误的迭代器值
- underscore.js,迭代器引用错误
- 去掉foreach中的自定义绑定以获取迭代器
- 迭代器中的return element.parentNode
- 如何使用量角器+angular获取迭代器索引/键
- 在jquery each()迭代器函数中访问JS对象
- jQuery 改进表迭代器
- jquery map 数组在迭代器中返回 NaN
- 迭代器范围不是本地的