JavaScript--总结四(作用域和预解析)
作用域:使用范围
全局变量:声明的变量是使用var声明的,那么这个变量就是全局变量,全局变量可以在页面的任何位置使用
除函数以外,其他的任何位置定义的变量都是全局变量
局部变量:在函数内部定义的变量是局部变量,外面是不能使用的
全局变量,如果页面不关闭,那么就不会释放,就会一直占空间,消耗内存
全局作用域:全局变量的使用范围
局部作用域:局部变量的使用返回
块级作用域:一对大括号就可以看成是一块,在这块区域中定义的变量,只能在这个区域中使用,但是在JS中,在这个块级作用域中定义的变量,外面可以使用;
说明:js没有块级作用域,函数除外
隐式全局变量:声明的变量没有var,就叫隐式全局变量(注意--如果在函数中有,没有用var定义的隐式全局变量,外面可以访问这个变量);
全局变量是不能被删除,隐式全局变量是可以被删除的
定义变量使用var是不会被删除的,没有var的是可以删除的
作用域链:只有函数可以制造作用域链,那么只要是代码,就至少有一个作用域,即全局作用域;凡是代码中有函数,那么这个函数就构成另一个作用域;如果函数中还有函数,那么在这个作用域中就又诞生一个作用域。
将这样的所有作用域列出来,可以有一个结构:函数内指向函数外的链式结构;就叫作作用域链。
// 案例1: function f1() { function f2() { } } var num = 456; function f3() { function f4() { } }
// 案例2 function f1() { var num = 123; function f2() { console.log( num ); } f2(); } var num = 456; f1();
预解析:提前解析代码
预解析:就是在解析代码之前
预解析做什么事?
把变量的声明提前了----提前到当前作用域的最上面
函数的声明也会被提前---提前到当前作用域的最上面
预解析过程:
-
把变量的声明提升到当前作用域的最前面,只会提升声明,不会提升赋值。
-
把函数的声明提升到当前作用域的最前面,只会提升声明,不会提升调用。
-
var a = 25; function abc (){ alert(a);//undefined var a = 10; } abc(); // 如果变量和函数同名的话,函数优先 console.log(a); function a() { console.log('aaaaa'); } var a = 1; console.log(a);
f1(); console.log(c);//9 console.log(b);//9 console.log(a);//报错 function f1(){ var a=b=c=9;
//以上可以看成
var a;
a=9; b=9; c=9;
//这里的b和c是隐式全局变量
console.log(a);//9 console.log(b);//9 console.log(c);//9 }
f1();//-----报错 var f1=function () { console.log(a); var a=10; }; // 函数表达式是赋值的,f1属于一个变量,将一个函数赋值给了f1; // 这种情况只是变量f1提前了,函数并没有