前端小吕学习语言第二天-Js作用域和预解析个人总结
JavaScript
Js作用域
-
作用域: 就是代码名字(变量)在某个范围内其作用和效果,目的是为了提高程序的可靠性,更重要的是减少命名冲突,
-
作用域分类(ES6)之前:全局作用域 局部作用域
全局作用域:整个script标签,或者是一个单独的js文件
局部作用域:(函数作用域)在函数内部就是局部作用域,这个代码名字只在函数内部器效果和作用。
-
变量的作用域:根据作用域的不同我们变量分为全局变量和局部变量
(1)全局变量:在全局作用域下的变量,在全局下都可以使用
- 注意:如果在函数内部没有声明,直接赋值的变量也叫全局变量
(2)局部变量:在局部作用域下的变量,在函数内部的变量,只能在函数内部使用
- 函数的形参也可以看做是局部变量
(3)从执行效率来看全局变量和局部变量:全局变量只有在浏览器关闭的时候才会销 毁,比较占内存资源;局部变量当我们程序执行完毕才会销毁,比较节约内存资源
-
js里没有块级作用域,是在es6的时候新增的块级作用域,目前使用是还可以调用
-
作用域链: 根据在内部函数可以访问外部函数变量的的这种机制,用链式查找决定哪些数据能被内部函数访问,就称为作用域链(就近原则)
Js预解析
- javascript代码是由浏览器中的js解析器来执行的。js解析器在运行js代码的时候分为两步:预解析和代码执行
-
预解析:js引擎会吧js里面所有的var还有function提升到当前作用域的最前面
-
预解析分为:变量预解析(变量提升)和函数预解析(函数提升)
变量提升:就是把所有的变量声明提升到当前的作用域最前面,不提升赋值操作
console.log(num); var num = 10; //浏览器的实际操作 var num console.log(num); num = 10; //故代码的输出结果为undefined
fun(); var fun = function(){ console.log(22); } //浏览器实际操作 var fun; fun(); fun = function(){ console.log(22); } //故代码的输出结果为出错
函数提升:就是把所有的函数提升到当前的作用域最前面,不调用函数
fun(); function fun(){ console.log(22); } //浏览器的实际操作 function fun(){ console.log(22); } fun(); //故代码输出结果为22
-
var a = b = c = 9
相当于var a = 9; b = 9; c = 9;
(b,c直接赋值,没有var声明,当全局变量看)集体声明
var a = 9, b = 9, c = 9;
预解析案列:
f1(); console.log(c); console.log(b); console.log(a); function f1(){ var a = b = c = 9; console.log(a); console.log(b); console.log(c); } //浏览器实际操作 function f1(){ var a = 9; b = 9; c = 9;//函数内变量未var声明,直接当作全局变量 console.log(a); console.log(b); console.log(c); } f1(); console.log(c); console.log(b); console.log(a);
-
THE END
- 网课听的B站pink老师的JS基础语法,有什么不对的地方欢迎各位大佬前来批评指正哇