1. var是函数级作用域,let是块级作用域
在for中声明,外部可以访问var 不能访问let
在函数中声明,var作用域是整个函数
在函数外声明,var作用域和全局变量一样,全局变量可以被删除,var 不能
2. 外部函数执行,会开辟一块内存空间
function outerFn(){
var i = 0;
function innerFn(){
i++;
console.log(i);
}
return innerFn;
}
var inner = outerFn()
inner();1
inner();2
inner();3
var inner2 = outerFn();
inner2();1
inner2();2
inner2();3
console.log(outerFn==outerFn) //true
console.log(outerFn()==outerFn()) //false
//在这里两次执行外部函数outerFn,开辟了两个不同的内存空间,var i是函数中的局部变量,所以在两个不同空间中i不同,修改一个i的值不影响另一个
3.在全局上下文中, let 声明的变量不属于window的属性 var和全局变量属于
let a=2;
var b=3;
c=4;
console.log(window.a) //undefined
console.log(window.b) //3
console.log(window.c) //4
另外 在相同作用域中 var可以重复声明,let和const不行
另外
var a=1;
b=2;
delete a; //false;
delete b; //true;
console.log(window.a); //1
console.log(window.b); //undefined
4.事件绑定是改变this指向
var a="window";
var obj={
a:"obj",
}
function fn(){
console.log(this.a)
}
console.log(fn.call(obj)) //obj undefined
console.log(fn.bind(obj)) //function () { [native code] }
call立即执行并返回undefined(函数返回值)
bind等待执行并返回函数指针
所以当绑定事件需要改变this指向时应该用bind
document.onclick=fn.bind(obj);
function fn(){
}