一、变量的作用域
在JS中只存在函数作用域不存在块作用域
当前作用于里面没有变量就找上一个作用域里的变量
var a,b;
function fn() {
console.log(a);//undefined
当前作用域里面有变量a所以就用当前作用域里的变量a
因为变量提升只提升声明部分不提升赋值部分 所以为undefined
console.log(b);//undefined
当前作用域里面没有变量b所以就找全局作用域里面的变量b
全局作用域里的变量b没有赋值 所以为undefined
var a = b = 1;
console.log(a)//1
当前作用域里面有变量a所以就用当前作用域里面的变量a
当前作用域里的变量a=b=1 所以为1
console.log(b);//1
当前作用域里面没有变量b所以就找全局作用域里面的变量b b被声明
虽然b没有赋值但进行到 var a=b=1时变量b被赋值为1 所以为1
}
fn();
console.log(a);//undefined
当前作用域里面有变量a 但没有赋值所以为undefined
console.log(b);//1
当前作用域里面有变量b 虽然b没有赋值但进行到 var a=b=1时变量b被赋值为1 所以为1
二、作用域链:
在JS中,如果某个变量没有var声明,就会自动到上一级作用域中去找这个变量的声明,
如果找到就使用,如果没有找到就继续向上查找,一直找的全局作用域为止;
如果全局作用域里也没有这个变量的声明语句;
那么浏览器就会自动帮你在全局作用域中对这个变量进行声明 (这种变量叫做隐式声明)。
三、注: 在JS中只存在函数作用域不存在块作用域
function fn() {
var a = 2;
console.log(a);
}
fn();
for(var i = 0; i<5; i++) {
}
console.log(i);
if(true) {
c = 3;
}
console.log(c);