function Student(name){
   var name = name || window;
   this.getName=function(){
       return name
   }
}
var lilei=new Student("李雷");
lilei.getName();//"李雷"
console.dir(lilei.getName);
//可以看到<function scope>
//          Closure
//              name: "李雷"
//          Global: Windowfunction Student(name){
   var name = name || window;
   this.getName=function(){
       return "11";
   }
}
var lilei=new Student("李雷");
lilei.getName();//"11"
console.dir(lilei.getName);
//可以看到<function scope>
//          Global: Windowfunction Student(name){
   this.getName=function(){
       var name = name || window;
       return name
   }
}
var lilei=new Student("李雷");
lilei.getName();//window
console.dir(lilei.getName);
//可以看到<function scope>
//          Global: Window
我知道js编译器会先定义好所有的变量,然后赋值,例如上面的,var name = name || window;会变成
var name;
name = name || window;
从上面的现象,得到简单结论:
1,形参是在所有变量定义前就定义好,并赋值的var name;对于已经存在的变量name是没影响的。
2,闭包是在JS引擎检测到函数依赖外部变量时,注入到函数的作用域中的。
3,如果要通过闭包调用函数外部变量,函数内不能定义相同变量名。因为如果定义了,闭包将不存在了。闭包JavaScript引擎编译器作用域