调用函数时,创建函数作用域,函数执行完毕后,函数作用域销毁
//变量提前
//并不是赋值提前,变量a提前此时a的值为undefined,
//而同名的函数提前,将会覆盖变量a,使a的值成为为函数。
var a = 10;
function fun(){
var a = "我是fun函数中的变量a";
var b = 20;
//console.log("a = "+a);
function fun2(){
console.log("a = "+window.a);
}
fun2();
}
//fun();
//console.log("b = "+b);
使用var关键字声明的变量,会在函数中所有的代码执行之前被声明
函数声明也会在函数中所有的代码执行之前执行
也可以这么认为在声明变量和显示声明函数的时候,函数的值会覆盖变量。
对于变量覆盖:只是针对重新声明变量。
同一个作用域中,会进行值得覆盖,函数覆盖变量;变量覆盖变量;函数覆盖函数。
.作用域嵌套
当一个作用域嵌套在另一个块或函数中,就产生了作用域嵌套。
function fun(1){
var a = b++;
function fun1(c){
console.log(a,b,c);
}
fun1(c++);
}
fun(1);
1,在当前作用域无法找到某变量时,向外层查找。
,2,不同作用域,不会出现覆盖情况
3, 如果在声明变量不加var,他会从当前域中是否存在该变量,如果没有,继续去上一层作用域查找,如果有就覆盖,如果没有继续查找,直到查找到顶层作用域。最后没有的话。会将该变量挂载在window对象中作为属性或者方法。作为全局变量,我们可以直接调用也可以直接使用window.变量名字
fn=()=>{
a = 2;
};
fn();
console.log(window.a);
块作用域
块作用域的用处:变量最好近距离声明,越近越好,避免污染。
1.let
let声明的变量可以将变量绑定到所在的任意作用域中即({ … }内部)
使用let声明的变量不会被提升。
function fun(1){
var a = b++;
function fun1(c){
console.log(a,b,c);
console.log(d);
}
fun1(c++);
let d = 2;
console.log(d);
}
fun(1)