var
使用var声明的变量的作用域是它当前执行的上下文,它可以是嵌套的函数,或者对于声明在任何函数外的变量来说是全局。(var没有块级作用域)
1.看清楚定义变量的位置,并不是所有变量都是全局变量,如在函数内定义变量,那它只在函数中有效。
function demo() {
var x = 10; //这里定义的是在函数内的全局变量,只在函数内有效
y = 20; //这里定义的是全局变量,不过这里在严格模式下会抛出异常
}
demo();
console.log(x); //会出现x未被定义错误
console.log(y); //输出20,不过这里不会输出,因为上一句出现错误程序终止了
2.使用变量前最好先声明变量,不一定要进行赋值操作。
console.log(test); //抛出ReferenceError异常
var test;
console.log(test); //输出undefine
3.变量提升,由于变量声明(以及其他声明)总是在任意代码执行之前处理的,所以在代码中的任意位置声明变量总是等效于在代码开头声明。
a=2;
var a;
我们可以理解为
var a;
a=2;
let
使用let定义的变量与var 不同的它是有块级作用域的,使用var定义的变量在{}外是依然能被访问到的。即:
{
var a=1;
}
console.log(a); //输出1
而let声明的变量只在let命令的代码块{}内有效,在{}外是无法访问到的。
{
let a=2;
console.log(a); //输出2
}
console.log(a); //这里不能输出,a为未定义变量
循环作用域
当使用var定义变量时
for (var i = 3; i <= 10; i++) {
setTimeout(function () {
console.log(i)
}
);
} //输出为11 11 11 11 11 11 11 11
当使用let定义变量时
for (let i = 3; i <= 10; i++) {
setTimeout(function () {
console.log(i)
}
);
} //这里输出3 4 5 6 7 8 9 10