美文网首页前端JavaScript
复习笔记之作用域 && 预解析(变量提升)

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

作者: 晚月川 | 来源:发表于2020-03-31 22:30 被阅读0次

作用域

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

JS中的作用域(ES6之前)

  • 全局作用域(整个script标签或者是一个单独的js文件)
  • 局部作用域(函数作用域)在函数内部的就是局部作用域

变量的作用域

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

  • 全局变量
    • 全局作用域下的变量,在全局下都可以使用
    • 在函数内部,没有声明直接赋值的变量也是全局变量
  • 局部变量
    • 在局部作用域下声明的变量(在函数内部的变量),只能在函数内部使用
    • 函数的形参也可以看作局部变量

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

  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代码的时候分为两步:预解析和代码执行

  • 预解析(变量提升):JS引擎会把JS里面所有带var和function的提升到当前作用域的最前面
  • 代码执行:按照代码书写的顺序自上而下执行

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

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();

相关文章

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

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

  • let和var的区别

    1. 变量作用域提升 浏览器在运行代码之前会进行预解析,首先解析函数声明,定义变量,解析完之后再对函数、变量进行运...

  • JS高级-闭包、沙箱

    作用域,作用域链,预解析 变量:局部变量、全局变量 作用域:变量的使用范围 js中没有块级作用域,一对括号中定义的...

  • js小知识点(预解析 引用 异常 严格模式)

    预解析:会预先解析一些(变量定义、函数会预解析);var a=12;只把var a提到作用域的顶部js会把变量的声...

  • 2020-05-28 vue-admin-ui总结

    作用域:var在函数里定义的才是局部变量。直接使用变量不声明则是隐式全局变量,函数里也是全局的预解析:变量声明提升...

  • 作用域和闭包

    变量提升(预解析) javascript的函数作用域是指在函数内声明的所有变量在函数体内始终是可见的,有意思的是,...

  • 作用域、作用域链

    作用域 在 JavaScript 中, 作用域为可访问变量,对象,函数的集合。 作用域下浏览器的操作 预解析(找v...

  • 1-let和const

    块级作用域 1.let注意 没有预解析,不存在变量提升在代码块内,只要let定义变量,在使用之前,都是报错,先定义...

  • js变量作用域 预解析 提升等

    //------------------------------变量作用域--------------------...

  • 作用域和预解析 关键字

    let,cosnt 作用域限制在{} const XXX_FFvar 全局变量 预解析(将声明的变量提前,声明...

网友评论

    本文标题:复习笔记之作用域 && 预解析(变量提升)

    本文链接:https://www.haomeiwen.com/subject/uxknuhtx.html