快速理解作用域

一提起作用域,好多初学js的小伙伴会觉得很蒙圈,这个大可不用担忧,只要肯用心,没有学不会的知识,废话不多说,进入正题,首先说一下什么是作用域:

一、作用域:

先举一个小例子来感受一下什么叫作用域,比如说小明是希望小学的一名学生,小花是希望小学一年级的一名学生,那么要找到小明这个人,我们先得确定一个区域范围,已经知道小明是希望小学的学生,那他肯定就在希望小学这个区域中,想对于小明来说,学校就是他的作用范围,要找到小明,我们只需要在他所在的作用域中去找就ok了;那要找到小花就更容易了,它不仅在希望小学这所学校,还知道她在一年级,也就是说一年级就是小花所在的作用范围。

在上面的例子中,希望小学是我们所提及到的最大的区域,可以看作是一个全局作用域,小明的范围锁定在学校,我们可以把小明看成是一个全局变量;一年级就是一个函数块,是全局作用域下的一个局部作用域,而小花就可以看作是一个局部变量。

作用域:变量的作用范围。

全局作用域:整个程序,从程序开始到结束。

局部作用域:函数体。

全局变量:在全局作用域中,变量都是有效的;在函数体的外部定义的变量都是全局变量;在函数体的内部没有var声明的变量,也有可能是全局变量

局部变量:在局部作用域中,变量都是有效的;在函数内部明确使用var定义的变量或所有的形参;函数调用后,局部变量自动销毁。

        function fn(){
            var num = 10;
        }
        fn();
        alert(num);    //报错:num is not defined

上面这段代码为什么会报错呢?

我们在上面说过,函数调用后,局部变量自动销毁,当我们调用fn时,fn里的变量num会自动销毁,再输出num时,num已经被销毁,所以会报错。

在了解了基本定义后,总结一下如何解析作用域:

一、寻找:

        var;

        形参;

        函数块;

二、逐行解析代码:

       1.找表达式;

       2.函数声明直接跳过(不调用不执行的原因);

       3.函数调用;

为了加深理解,我们来看一些例子:

        var num = 19;
        function fn(){
             var num = 10;
         }
        fn();
         alert(num);  //19

 原理:函数调用之后,局部变量自动销毁,所以输出的是全局变量num的值。

        var num = 19;
        function fn(){
             num = 10;
         }
         fn();
         alert(num);  //10

原理:当局部作用域中找不到var时,可以向它的父级全局作用域借,此时函数块里的局部变量就是全局变量19,因为给出num=10,所以将10赋给全局变量num,全局变量num=10,输出num=10.

原文地址:https://www.cnblogs.com/kinoko-1009/p/10278481.html