关于作用域

Posted 麦兜家园

tags:

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

关于作用域,可能大家都在用,但是真正能说的清楚的却不多,我呢也只是简单谈一下我所了解的比较浅的认识。

作用域顾名思义可以分“作用”和“域”:

域:空间、范围、区域……

作用:读、写

我们写的s内容都知道是在<script></script>里面,其实这就相当于是一个作用域,而在这个作用域里的内容还分为全局变量和局部变量。我们所写的js呈现出的好多效果主要是靠js解析器来解析的,是自上而下,由里到外一步步的进行的。

js解析器的主要工作原理是:

1)“找一些东西” :var function 参数
        a = ...

        所有的变量,在正式运行代码之前,都提前赋了一个值:未定义

        fn1 = function fn1(){ alert(2); }

        所有的函数,在正式运行代码之前,都是整个函数块

        JS 的预解析

        遇到重名的:只留一个

        变量和函数重名了,就只留下函数

2)逐行解读代码:

        表达式:= + - * / % ++ -- ! 参数……

        表达式可以修改预解析的值!

接下来写几个简单的例子,来看看通过js解析器有规律,有顺序的解析之后返回的值是什么:

alert(a);                    // function a (){ alert(4); }
var a = 1;
alert(a);                    // 1
function a (){ alert(2); }
alert(a);                    // 1
var a = 3;        
alert(a);                    // 3
function a (){ alert(4); }
alert(a);                    // 3
var a = 1;
function fn1(){
    alert(a);                        // undefined
    var a = 2;
}
fn1();
alert(a);                            // 1
var a = 1;
function fn1(){
    alert(a);                        // 1
    a = 2;
}
fn1();
alert(a);                            // 2
var a = 1;
function fn1(a){
    alert(a);                        // undefined
    a = 2;
}
fn1();
alert(a);                            // 1
var a = 1;
function fn1(a){
    alert(a);                        // 1
    a = 2;
}
fn1(a);
alert(a);                            // 1

 以上例子,通过js解析器的逐步解析将得出不同的结果,当然前提还是遵循以上所提到的两个规则。

所以,一定要熟练掌握其中的精髓,好清楚了解有些js产生的不同结果。有点拗口,但是还是希望大家对你有帮助!加油!

以上是关于关于作用域的主要内容,如果未能解决你的问题,请参考以下文章

JS 作用域及作用域链

作用域是什么?

JavaScript 作用域 与 作用域链

js 关于闭包的小总结

JS---闭包

关于 js 的作用域的对话过程的理解