欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  web前端

js--变量的作用域

程序员文章站 2022-05-24 08:43:44
...
作为一名菜鸟的我,每天学点的感觉还是不错的。今天学习闭包的过程中看到作用域与作用域链这两个概念,我觉得作为一名有追求的小白,有必要详细了解下。

变量的作用域

就js变量而言,有全局变量和局部变量。这里我觉得这个按字面意思理解就行了.......下面举个例子

var message = "今天我做的糯米蒸排骨"; //定义一个全局变量function doL(){

  var ss = "侠客行很好看";      //定义一个局部变量

  alert(message);             //输出"今天我做的糯米蒸排骨",在函数中可以引用到全局变量

  function alertDo(){

    alert(ss);

  }

  alertDo();             //输出"侠客行很好看",这就涉及变量的作用域了

};doL();
alertDo();              //没法输出  alertDo is not definedalert(message);         //可以输出"今天我做的糯米蒸排骨"

这边有2个很有意思的地方

1.当变量不用var声明的时候我们实际上声明了一个全局变量,好吧,这是错误的,看下面,num是一个全局变量,

mum = 1;

事实上是对属性赋值操作。首先,它会尝试在当前作用域链(如在方法中声明,则当前作用域链代表全局作用域和方法局部作用域etc。。。)中解析 mum ; 如果在任何当前作用域链中找到mum ,则会执行对mum 属性赋值; 如果没有找到mum ,它才会在全局对象(即当前作用域链的最顶层对象,如window对象)中创造mum 属性并赋值。

注意!它并不是声明了一个全局变量,而是创建了一个全局对象的属性。由于变量声明自带不可删除属性,比较var num = 1 跟 num = 1,前者是变量声明,带不可删除属性,因此无法被删除;后者为全局变量的一个属性,因此可以从全局变量中删除。

var num =1;
mum = 1;

2.变量声明会提前到函数顶部,其实之前已经遇到过了

    var scope="global";  function t(){  
        console.log(scope);  var scope="local"  
        console.log(scope);  
    }  
    t();

它首先会输出undefined,然后才是scope,它会将变量提前声明并且覆盖局部变量,等价于下面这种情况

    var scope="global";  function t(){  var scope;
        console.log(scope);  
        scope="local"  
        console.log(scope);  
    }  
    t();

以上就是js--变量的作用域的详细内容,更多请关注其它相关文章!