根据JavaScript文档,函数内创建的变量是该函数的本地变量。但是,我发现在for循环中声明变量时不使用文字var
会导致意外行为(例如https://jsfiddle.net/carlesaraguz/ao77ac2L/)
为什么?
function iterate1() {
var array = ["hello", "world"];
var str = "";
for (i = 0; i < array.length; i++) {
str += "iterate0 --- " + i + ": " + array[i] + "<br>";
iterate2(array);
str += "iterate0 --- " + i + ": " + array[i] + "<br>";
}
document.getElementById("output0").innerHTML = str;
}
function iterate2(arr) {
var str = ""
for (i = 0; i < arr.length; i++) {
str += "iterate1 --- " + i + ": " + arr[i] + "<br>";
}
document.getElementById("output1").innerHTML = str;
}
$(function() {
iterate1();
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p id="output0"></p>
<p id="output1"></p>
&#13;
答案 0 :(得分:1)
这是一个忘记放置var时会发生什么的例子。 变量的范围变为全局
(function() {
myVar = 1;
console.log("myVar should be 1: " + myVar); // should be 1
setTimeout(function() {
console.log("myVar should be 1, but isn't: " + myVar); // should be 1, but isn't
}, 100);
})();
(function() {
for(myVar = 1; myVar < 10; myVar++) {
// nothing, just increment var
}
})();
您会注意到有两个功能相互隔离,但实际上使用相同的myVar
要添加,var
的范围是它在声明后附上的功能,无论它是否在for
中声明循环或if
或任何其他类型的块级语句。
在您的特定情况下,这里发生了什么。
iterate0 - 0 - 你好|将i
声明为global
,其值为0,打印
iterate1 - 0 - 你好|将i
的值更改为0,打印后再增加i
iterate1 - 1-世界| i
从先前的增量开始为1,打印,在循环后再次递增
iterate0 - 2 - undefined | i
从先前的增量开始为2,打印,再次递增,将其提升至3
端
答案 1 :(得分:1)
在声明变量之前不使用“var”,您将创建一个全局变量而不是本地变量。
function f1() {
for (var i = 0; i...) {
// i is local to this function
}
}
function f2() {
for (i = 0; i...) {
// i is a global variable
}
}
有关此内容的详情,请参阅https://stackoverflow.com/a/1470494/5780021