VAR
var定义的变量最小作用域是function:
for(var i = 0; i < 5; i++) {
var x = 6;
}
console.log("for循环里的var i: " + i); //5
console.log("for循环里的var x: " + x); //6
if(true) {
var a = 1;
}
console.log("if里的var a: " + a); //1
function getDomain() {
var j = 2;
}
getDomain();
console.log("function里的var j:" + j); //undefined
let
let定义的变量作用域是 声明它的块:
如上面的 for、if、function都作为一个块:
for(let i = 0; i < 5; i++) {
let x = 6;
}
console.log("for循环里的let i: " + i); //undefined
console.log("for循环里的let x: " + x); //undefined
if(true) {
let a = 1;
}
console.log("if里的let a: " + a); //undefined
function getDomain(){
let j = 2;
}
getDomain();
console.log("function里的let j:" + j);//undefined
const
const声明时,必须给变量赋值,且声明的变量不可修改:
const b=5;
//const b;错误写法
console.log(b);
//b += 1;错误写法
声明变量时不使用var、let或const时,定义的变量是全局变量
function getDomain() {
j = 2;
}
getDomain();
console.log(j); //2
闭包
综上无论是var还是let,函数内定义的变量,函数外都是获取不到的,那如何从函数外读取函数的内部变量那?这就是大家常说的闭包了;
function getDomain(){
var j = 2;
function innerFuc(){
console.info(j);
}
return innerFuc;
}
var innerFuc = getDomain();
innerFuc();//2;
这里的innerFuc就是一个闭包。