变量提升
var a="hello world"
function fun(){
console.log(a);
var a="hello nick"
console.log(a);
}
fun();
//第一个输出是undefined 然后是 hello nick
因为这里变量发生了提升 转换后的代为为
var a="hello world";
function fun(){
var a;
console.log(a);
a="hello nick";
console.log(a)
}
闭包:能够访问函数内部变量的函数
为什么要用:
1、便于代码的理解
2、减少全局变量的声明
3、保证键值对不随上一级函数的执行完成而销毁
function fun1(){
var n=1;
nadd=function(){
n+=1;
}
function fun2(){
console.log(n);
}
}
var result =fun1();
result();//1
nadd();
result();//2
1. var result=fun1(); 返回了一个函数f1, 因此result为f1。 2. result(); 调用fun2,显然输出1. 3. nAdd(); 这里需要注意,这个nAdd实际上在定义的时候是一个lambda,是一个匿名函数,功能是n+=1。定义时将这个函数赋值给nAdd。所以在此时,实际上是调用了n+=1.为什么能找到n?因为n在堆里面。 4. result(); 调用f2,显然输出2.
最后一点,n在堆上如何被销毁,这个工作是垃圾收集器负责。当n不在被任何闭包的env引用的时候,会被回收。