默认情况下是顺序结构, 代码会从上至下的执行, 前面没执行完后面的不能执行
默认情况下通过var定义的变量, 只要不是定义在函数中都是全局变量
-
不能同步
// 不能同步
for (var i = 0; i < 3; i++){
function test() {
console.log(i);
}
}
test(); // 3
-
可以同步
for (var i = 0; i < 3; i++){
function test() {
console.log(i); // 0 1 2
}
// 每次循环都立即调用这个函数
test();
}
for (var i = 0; i < 3; i++){
// 使用立即执行的函数
(function test() {
console.log(i); // 0 1 2
})();
}
for (var i = 0; i < 3; i++){
// 使用立即执行的函数, 并且将i的值传给这个函数
(function test(index) {
console.log(index); // 0 1 2
})(i);
}
在ES6中如果在循环中通过let定义的变量, 那么这个变量是一个局部变量
var list = [];
// 这里的i是全局变量
for (var i = 0; i < 3; i++){
var fn = function test() {
console.log(i);
};
list.push(fn);
}
// console.log(i); // 3
list[0](); // 3
list[1](); // 3
list[2](); // 3
-
注意点: 由于 i 是局部变量, 所以每次执行完循环体都会重新定义一个 i 变量
let list = [];
// 这里的i是局部变量
// 注意点: 由于i是局部变量, 所以每次执行完循环体都会重新定义一个i变量
for (let i = 0; i < 3; i++){
let fn = function test() {
console.log(i);
};
list.push(fn);
}
// console.log(i); // i is not defined
list[0](); // 0
list[1](); // 1
list[2](); // 2
-
注意点: 在ES6中由于 {} 是块级作用域, 所以只要在块级作用域中定义了一个函数
-
并且这个函数用到了块级作用域中的数据, 那么这个函数就是闭包
for (let i = 0; i < 3; i++){
// 注意点: 在ES6中由于{}是块级作用域, 所以只要在块级作用域中定义了一个函数
// 并且这个函数用到了块级作用域中的数据, 那么这个函数就是闭包
function test() {
console.log(i);
}
}
// 由于每次循环都会新定义一个变量, 后定义的会覆盖先定义的
test(); // 2
网友评论