zl程序教程

您现在的位置是:首页 >  Javascript

当前栏目

js作用域链与预解析

2023-02-25 18:27:41 时间

1. 作用域

1.1 全局作用域

在script标签下直接声明的变量或函数,都会在全局作用域下。可以在程序任何地方拿到

1     <script>
2         var a = "全局变量a"
3         let b = "全局变量b"
4         const c = "全局变量c"
5     </script>

1.2 函数作用域

也叫局部作用域,如果一个变量是在函数内部声明的,它就处于函数作用域。这些变量只能在函数内部访问,不能在函数以外去访问。

(函数执行完内部变量就会被js销毁,除非使用闭包)

1function aaa(params) {
2  var bb = "bb";
3}
4
5console.log(bb);//bb is not defined

1.3 块级作用域

只适用于let、const,被这俩关键字定义的变量会产生块级作用域。 大括号之外不能访问,比如if、for循环...

1if (true) {
2  var a = "a";
3  let b = "b";
4  const c = "c";
5}
6
7console.log(a);//"a"
8console.log(b);//b is not defined
9console.log(c);//c is not defined
10

1.4 作用域链

在使用一个变量的时候,首先js会先在当前作用域下去寻找该变量,如果没找到,再到它的上层作用域寻找,以此类推直到找到该变量或是已经到了全局作用域。

1var bb = "bb"; //在这层找到了
2
3(function aaa() {
4  //当前作用域没有,向上层查找
5  console.log(bb);
6})(); //bb

2. 预解析

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

  • 预解析:var声明的变量(不赋值)和函数,会被提升到当前作用域最前面
  • 代码执行:按照代码书写的顺序从上往下执行

预解析优先级:

函数>变量

因为函数提升是整体提升,变量提升不会被赋值,而是执行到那一步才赋值