js中变量的作用域,作用域链和预解析

787 阅读1分钟

变量,分为局部变量和全局变量

作用域:是指变量的使用范围,分为局部作用域和全局作用域
注意:js中没有块级作用域,即大括号中定义的变量,这个变量可以在大括号外面使用。函数中的大括号不算,函数中定义的变量是局部变量。

{
    var num = 10;
}
console.log(num);
//输出:10

作用域链:变量的使用,是从里向外,层层搜索,最外层是最后搜索的,为0级。如果找到最外层还没有该变量,则结果报错。

 var num=10; //作用域链 级别:0
   var num2=20;
   var str = "abc"
   function f1() {
     var num2=20;
     function f2() {
       var num3=30;
       console.log(num);
     }
     f2();
   }
   f1();

预解析:浏览器在解析代码之前,会把变量的声明和函数声明提到其作用域的最上面。

变量的声明

//变量的提升
    console.log(num);
    var num=100;
// 输出:undefined,因为num的声明在输出之前,而赋值是在输出之后,其流程如下:
// var num;
// console.log(num);
// num=100;

函数的声明

    f1();
    function f1() {
      console.log("这个函数,执行了");
    }
//输出:这个函数,执行了


    f2();
    var f2=function () {
      console.log("小杨好帅哦");
    };
//输出:报错,因为这是函数的表达式,不是函数的声明,其流程如下
var f2;
f2();
f2=function () {
      console.log("小杨好帅哦");
    };