美文网首页
JavaScript中的作用域、预解析与变量声明提升

JavaScript中的作用域、预解析与变量声明提升

作者: 3e2235c61b99 | 来源:发表于2021-07-13 10:05 被阅读0次

作用域

就是变量的有效范围。在一定的空间里可以对数据进行读写操作,这个空间就是数据的作用域
1、全局作用域:最外层函数定义的变量拥有全局作用域,即对任何内部函数来说,都是可以访问的;
1、全局作用域:局部作用域一般只在固定的代码片段内可访问到,而对于函数外部是无法访问的,最常见的例如函数内部。在ES6之前,只有函数可以划分变量的作用域,所以在函数的外面无法访问函数内的变量
3、块级作用域:凡是代码块就可以划分变量的作用域,这种作用域的规则就叫块级作用域

块级作用域 函数作用域 词法作用域之间的差异:

区别

  1. 块级作用域和函数作用域描述的是,什么东西可以划分变量的作用域
  2. 词法作用域描述的是,变量的查找规则

关系

  1. 块级作用域 包含 函数作用域
  2. 词法作用域 与 块级作用域、函数作用域之间没有任何交集,他们从两个角度描述了作用域的规则

ES6 之前 JavaScript 采用的是函数作用域+词法作用域,ES6 js 采用的是块级作用域+词法作用域

预解析

JavaScript 代码的执行是由浏览器中的 JavaScript 解析器来执行的。JavaScript 解析器执行JavaScript 代码的时候,分为两个过程:预解析过程和代码执行过程
预解析过程

  1. 把变量的声明提升到当前作用域的最前面,只会提升声明,不会提升赋值
  2. 把函数的声明提升到当前作用域的最前面,只会提升声明,不会提升调用
  3. 先提升 var,再提升 function

示例1:

var a = 25;
function abc() {
    alert(a);
    var a = 10;
}
abc();

以上代码弹出undefined

示例2:

console.log(a);
function a() {
    console.log('aaaaa');
}
var a = 1;
console.log(a);

以上代码输出:

ƒ a() {
    console.log('aaaaa');
}
1

变量提升

变量提升:定义变量的时候,变量的声明会被提升到作用域的最上面,变量的赋值不会提升
函数提升:JavaScript 解析器首先会把当前作用域的函数声明提前到整个作用域的最前面

示例3:

var num = 10;
fun();
function fun(){ 
    console.log(num);
    var num = 20;
}

以上代码输出undefined

示例4:

var a = 18;
f1();
function f1(){
    var b = 9;
    console.log(a);
    console.log(b);
    var a = '123';
}

以上代码输出:

undefined
9

示例5:

f1();
console.log("c" + c);
console.log("b" + b);
console.log("a" + a);
function f1() {
    var a = b = c = 9;
    console.log("aa" + a);
    console.log("bb" + b);
    console.log("cc" + c);
}

以上代码输出

aa9
bb9
cc9
c9
b9
Uncaught ReferenceError: a is not defined  // 最后一行报错

上面最后一行报错的原因是:
var a = b = c = 9;相当于c = 9; b = c; var a = b,其中cb为隐式声明,avar显示声明.在函数内部显示声明的变量为局部变量,隐式声明的变量为全局变量,所以全局变量cb在函数外可以访问到,而局部变量a在函数外访问不到
把以上代码改为下面这样,可以正常执行

f1();
console.log("c" + c);
console.log("b" + b);
console.log("a" + a);
function f1() {
    a = b = c = 9;
    console.log("aa" + a);
    console.log("bb" + b);
    console.log("cc" + c);
}

输出为:

aa9
bb9
cc9
c9
b9
a9

相关文章

  • 作用域和闭包

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

  • JavaScript中的作用域、预解析与变量声明提升

    作用域 就是变量的有效范围。在一定的空间里可以对数据进行读写操作,这个空间就是数据的作用域1、全局作用域:最外层函...

  • 作用域、作用域链

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

  • let和var的区别

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

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

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

  • JS知识点

    1.解释 JavaScript 中的作用域与变量声明提升? 我对作用域的理解是只会对某个范围产生作用,而不会对外产...

  • 作用域和预解析 关键字

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

  • JS面试知识点 变量提升

    变量提升,也可以说成是变量声明提升,是指在Javascript中变量的声明会被提到作用域的顶部,而变量的赋值留在原...

  • 阿里前端 面试问题

    JavaScript相关须是达到精通 JavaScript作用域链 JavaScript变量声明提升 JavaSc...

  • 块作用域和let、const

    在ES6之前,JavaScript没有块级作用域,只有全局作用域和函数作用域。 变量提升即将变量声明提升到它所在作...

网友评论

      本文标题:JavaScript中的作用域、预解析与变量声明提升

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