js学习--变量作用域

Posted 铸剑师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js学习--变量作用域相关的知识,希望对你有一定的参考价值。

作为一名菜鸟的我,每天学点的感觉还是不错的。今天学习闭包的过程中看到作用域与作用域链这两个概念,我觉得作为一名有追求的小白,有必要详细了解下。

变量的作用域

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

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

function doL(){

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

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

  function alertDo(){

    alert(ss);

  }

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

};
doL();
alertDo();              //没法输出  alertDo is not defined

alert(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学习--变量作用域的主要内容,如果未能解决你的问题,请参考以下文章

js学习日记-变量的坑

js学习--变量作用域

《JS权威指南学习总结--8.6 函数闭包》

js学习笔记1(变量作用域内存)

JavaScript作用域学习笔记

JS学习笔记——作用域链