JavaScript--总结四(作用域和预解析)

作用域:使用范围

全局变量:声明的变量是使用var声明的,那么这个变量就是全局变量,全局变量可以在页面的任何位置使用

除函数以外,其他的任何位置定义的变量都是全局变量

局部变量:在函数内部定义的变量是局部变量,外面是不能使用的

全局变量,如果页面不关闭,那么就不会释放,就会一直占空间,消耗内存

 

全局作用域:全局变量的使用范围

局部作用域:局部变量的使用返回

块级作用域:一对大括号就可以看成是一块,在这块区域中定义的变量,只能在这个区域中使用,但是在JS中,在这个块级作用域中定义的变量,外面可以使用;

说明:js没有块级作用域,函数除外

 

隐式全局变量:声明的变量没有var,就叫隐式全局变量(注意--如果在函数中有,没有用var定义的隐式全局变量,外面可以访问这个变量);

全局变量是不能被删除,隐式全局变量是可以被删除的

定义变量使用var是不会被删除的,没有var的是可以删除的

 

作用域链:只有函数可以制造作用域链,那么只要是代码,就至少有一个作用域,即全局作用域;凡是代码中有函数,那么这个函数就构成另一个作用域;如果函数中还有函数,那么在这个作用域中就又诞生一个作用域。

将这样的所有作用域列出来,可以有一个结构:函数内指向函数外的链式结构;就叫作作用域链。

// 案例1:
function f1() {
    function f2() {
    }
}

var num = 456;
function f3() {
    function f4() {    
    }
}

  

 

 

 

 

// 案例2
function f1() {
    var num = 123;
    function f2() {
        console.log( num );
    }
    f2();
}
var num = 456;
f1();

 

 

 

 

预解析:提前解析代码

预解析:就是在解析代码之前

预解析做什么事?

把变量的声明提前了----提前到当前作用域的最上面

函数的声明也会被提前---提前到当前作用域的最上面

预解析过程:

  1. 把变量的声明提升到当前作用域的最前面,只会提升声明,不会提升赋值。

  2. 把函数的声明提升到当前作用域的最前面,只会提升声明,不会提升调用。

  3. 先提升var,在提升function   

 

var a = 25;
function abc (){
  alert(a);//undefined
  var a = 10;
}
abc();
// 如果变量和函数同名的话,函数优先
console.log(a);
function a() {
  console.log('aaaaa');
}
var a = 1;
console.log(a);
        f1();
        console.log(c);//9
        console.log(b);//9
        console.log(a);//报错
        function f1(){
            var a=b=c=9;
//以上可以看成
var a;
a=9; b=9; c=9;
//这里的b和c是隐式全局变量
console.log(a);//9 console.log(b);//9 console.log(c);//9 }
    f1();//-----报错
   var f1=function () {
      console.log(a);
      var a=10;
    };

    // 函数表达式是赋值的,f1属于一个变量,将一个函数赋值给了f1;
    // 这种情况只是变量f1提前了,函数并没有

 

posted on 2021-01-04 21:07  小田的日常  阅读(58)  评论(0编辑  收藏  举报

导航