关于作用域,可能大家都在用,但是真正能说的清楚的却不多,我呢也只是简单谈一下我所了解的比较浅的认识。
作用域顾名思义可以分“作用”和“域”:
域:空间、范围、区域……
作用:读、写
我们写的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产生的不同结果。有点拗口,但是还是希望大家对你有帮助!加油!