1、作用域
一般情况下,一段代码中所用到的名字并不总是有效可用的,
而限定这个名字(变量)的可用性的代码范围就是这个名字的作用域,可用有效的减少变量名冲突
2、js的作用域(es6)之前:全局作用域,局部作用域
3、全局作用域:整个script标签 或者是单独的JS文件
4、局部作用域(函数作用域),在函数内部就是局部作用域,这个变量名只能在函数内部使用
5、变量作用域
根据作用域的不同,变量分为全局变量,局部变量
注意
如果在函数内部没有声明直接赋值的变量也叫全局变量
函数的形参也是局部变量
全局变量:只有浏览器关闭的时候才会销毁,比较占内存
局部变量:当程序执行完毕就会销毁,比较节约内存
6、现阶段JS没有块级作用域
在es6中有块级作用域
块级作用域 {} if{} for{}
7、作用域链
内部函数访问外部函数 采用的就是链试这种结果就是作用域链 (就近原则)
预解析
先预解析 然后执行代码
JS引擎会把var和function全部提到当前作用域的最前面然后按照代码的顺序从上往下执行
预解析分为 变量预解析 和 函数预解析
变量提升~~~~~~ 变量声明提升到当前作用域的最前面 不提升赋值操作
函数提升~~~~~~ 函数声明提升到当前作用域的最前面 不调用函数
函数表达式函数的调用必须写在函数表达式函数的下面
1 // 局部变量 2 function fn() { 3 var num = 9; 4 console.log(num); 5 } 6 fn() 7 8 9 // 作用域链 10 var num = 7; 11 12 function fn1() { // 外部函数 13 var num = 3; 14 15 function fn2() { // 内部函数 内部函数可以访问外部函数 16 console.log(num); 17 var sum = 4; 18 } 19 fn2() 20 } 21 fn1() 22 23 24 25 console.log(num1); //坑1 26 var num1 = 80 27 28 29 fun() //坑2 30 var fun = function () { 31 console.log(66); 32 33 } 34 35 // 经典预解析案例 36 f1() 37 console.log(c); 38 console.log(b); 39 console.log(a); 40 41 function f1() { 42 var a = b = c = 9; 43 // 相当于var a=9;b=9;c=9 b,c 没有声明直接赋值就是全局变量 44 console.log(a); 45 console.log(b); 46 console.log(c); 47 } 48 // 99999 a is not defined