相信学过javascript的童鞋们都知道作用域在在其中的重要性了,然而很多人在刚接触过作用域后,对于作用域的理解,可能都会有点似懂非懂,今天楼主就对
作用域进行详细讲解,并附有各种面试考题例子,希望对于看过这篇文章的童鞋能有所帮助。
首先:我们在字面上理解下作用域。
作用:指“读 写”。
域:指“空间、范围、区域......”。
所以作用域可以理解为:在一个范围区域内进行读写操作。
接下来:我们来模拟一下浏览器对于javascript的解析过程。
首先我们要了解浏览器对javascript的解析是从上往下开始逐行解析的。
对于浏览器:
可将浏览器内部模拟出一个“JS解析器”
(1):首先进行JS的预解析
解析器会“找一些东西”:var(变量) function(函数) 参数
比如找到一个变量a-> a=...(undefined)
所有的变量,在正式运行代码之前,都会提前赋一个值:undefined。
或者比如找到一个函数fn1-> fn1=function fn1(){alert(1);}
所有的函数,在正式运行代码之前,都是整个函数块。
遇到重名只留下一个,变量和函数名重名了,就只留下函数
(2):解析器再逐行解读代码:
碰到表达式可以修改预解析里的值。
例:表达式:= - * / % ++ -- ! 参数......
一个变量如果作用于整个作用域,则称这个变量为全局变量,作用域为全局函数
一个变量如果只作用于一个函数内部,则称这个变量为局部变量,作用域为局部函数
接下来通过各个例子,来对作用域进行更深刻的理解。
//楼主就对第一个例子进行详细说明,接下来的例子希望童鞋们通过自己的理解来进行解答
alert(a); // function a(){alert(2)}
var a=1; //根据上面的解析过程 首先找到变量和函数,并给
alert(a); // 1 变量赋上未定义,函数附上整个函数块。
function a(){alert(2);} a=... a=function a(){alert(2)}
alert(a); // 1 因为变量名和函数名重名了,所以只留下函数。
var a=3; a=function a(){alert(2)}
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
通过以上例子,相信大家对于作用域一定有了更加深刻的理解,那么楼主就出一道小题,答案大家可以写在评论里,或者简信给我。
<script>
window.onload=function(){
var oBtn=document.getElementsByTagName('input');
for(var i=0;i<3;i++){
oBtn[i].onclick=function(){
alert(i);
}
}
}
</script>