es5作用域与预解析

93 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第15天,点击查看活动详情

作用域

//就是代码名字在某个范围内起作用和效果

目的是为了提高程序的可靠性更重要的是减少命名冲突

es6之前

全局作用域 (整个script标签或者是一个单独的js文件)

var num = 0;

 

局部作用域(函数作用域)代码只在函数内部起效果和作用

function fn() {

//局部作用域

}

 

变量的作用域:根据作用域的不同我们把变量分为全局变量和局部变量

全局变量: 在全局作用域下的变量

//注意 在函数内部,没有声明直接赋值的变量也属于全局变量

var num = 10; //num就是一个全局变量

 

局部变量 在局部作用域下的变量 后者在函数内部的变量就是局部变量

//注意函数的形参也可以看做是局部变量

function fun(aru) {

var num1 = 10; //num1只能是局部变量,只能在函数内部使用

num2 = 20;

}

 

从执行效率来看全局变量和局部变量

全局变量只有在浏览器关闭是才会被销毁,比较占内存

局部变量:只有代码块被执行时,会被初始化,代码块运行结束,会被销毁,会更节省空间

 

js块级作用域

es6之后新增 for{} if{}

 

作用域链(就近原则)

内部函数访问外部函数的变量,采取的是链式查找的方式来决定取哪个值,这种结构我们称为作用域链

预解析

js引擎运行js分为两步: 预解析 代码执行

js引擎会把js里面的所有var 还有 提升到当前作用域的最前面

代码执行 按照代码书写的顺序从上往下执行

 

预解析分为变量预解析(变量提升) 和函数预解析 (函数提升)

 

变量提升 就是把所有的变量声明提升到当前作用域的最前面,不提升赋值操作

函数提升 就是把所有的函数声明提升到当前作用域的最前面 不调用函数