前端JavaScript

复习笔记之作用域 && 预解析(变量提升)

2020-03-31  本文已影响0人  晚月川

作用域

JS的作用域:代码名字(变量)在某个范围内起作用和效果
目的:为了提高程序的可靠性,更重要的是减少命名冲突

JS中的作用域(ES6之前)

变量的作用域

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

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

  1. 在任何一个地方都可以使用,只有在浏览器关闭时才会被销毁,因此比较占内存
  2. 在函数内部使用,当其所在的代码块被执行时,会被初始化;当代码块运行结束后,就会被销毁,因此比较节省空间

块级作用域

JS中在ES6之前没有块级作用域

作用域链

  1. 只要是代码,就至少有一个作用域
  2. 写在函数内部的是局部作用域
  3. 如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域
  4. 根据在内部函数又可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问,就称作作用域链
    作用域链:内部函数访问外部函数的变量采用的是链式查找的方式来决定取哪个值,这种结构我们称为作用域链(就近原则)
    ================
    案例:
function f1() {
    var num = 123;
    function f2() {
        console.log(num); //=>123  站在目标出发,一层一层往外查找
    }
    f2();
}
var num = 456;
f1();

预解析(变量提升(声))

JavaScript代码是由浏览器中的JavaScript解析器来完成的,JavaScript解析器在运行JavaScript代码的时候分为两步:预解析和代码执行

预解析分为变量预解析(变量提升)和函数预解析(函数提升)
变量提升:把所有的变量声明提升到当前作用域最前面,不提升赋值操作
函数提升:把所有的函数声明提升到当前作用域最前面,不调用函数

f1();
console.log(c); //=> 9
console.log(b); //=> 9
console.log(a); //=> 报错
function f1() {
    var a = b = c = 9;
    console.log(a); //=> 9
    console.log(b); //=> 9
    console.log(c); //=> 9
}
// 函数表达式调用必须写在函数表达式的下面
// 错误示例如下:
fun();
var fun = function(){
    console.log(95);
}

// 下面的是正确的:
var fun = function() {
    console.log(95);
}
fun();
上一篇下一篇

猜你喜欢

热点阅读