您的位置:首页 > Web前端 > JavaScript

js作用域

2015-06-04 16:52 681 查看
<!DOCTYPEHTML>
<html>
<head>
<metahttp-equiv="Content-Type"content="text/html;charset=utf-8">
<title>无标题文档</title>
<script>
/*
//作用域:
//域:空间、范围、区域……
//作用:读、写
script全局变量、全局函数
自上而下。一个script就是一块,上下两块不同,单线程。上面存着的可以被下面访问的到。
函数
由里到外。不能从外到内,子级作用域找不到就去父级作用域,作用域链。
遇见函数调用,也会发生预解析,逐行解读代码,相当于有一个小的仓库。
{}
浏览器:
“JS解析器”的步骤
1)首先“找一些东西”:varfunction参数
a=...
所有的变量,在正式运行代码之前,都提前赋了一个值:未定义
fn1=functionfn1(){alert(2);}
所有的函数,在正式运行代码之前,都是整个函数块
JS的预解析
遇到重名的:只留一个无论上下
变量和函数重名了,就只留下函数,函数是一等公民,预解析两个函数重名的时候,下面
的代替上面的
2)接着逐行解读代码:
表达式:=+-*/%++--!参数(参数传参也可以修改值)……
表达式可以修改预解析的值!
alert(a);//functiona(){alert(4);}
vara=1;
alert(a);//1
functiona(){alert(2);}
alert(a);//1
vara=3;
alert(a);//3
functiona(){alert(4);}
alert(a);//3
alert(typeofa);
//a();3()肯定是错误的//报错
*/
/*
vara=1;
functionfn1(){
alert(a);//undefined
//函数内部a和外面完全没有关系。先预解析a=……然后逐行解读遇见表达式再修改
vara=2;
}
fn1();
alert(a);//这次的a是全局范围的a所以找到11
vara=1;
functionfn1(){
alert(a);//1预解析之后执行时找到外面的作用域去
a=2;所以里面的表达式有能力去改外面的值修改的是外部的
}
fn1();
alert(a);//2全局的a被修改为2了
*/
/*
vara=1;
functionfn1(a){
alert(a);//undefined所以执行了就是undefined
//预解析时候找到了参数(参数就是一个局部变量)但是没有传参,就是undefined
a=2;//修改的是局部的,因为并没有去找外部作用域
}
fn1();
alert(a);//1
vara=1;
functionfn1(a){函数调用,a传参,此时的a已经被全局的a赋值等于1
alert(a);//1
a=2;修改的是局部的a,和外面全局的没关系



}
fn1(a);
alert(a);//1
*/
</script>
</head>
<body>
</body>
</html>


/*
varnum=0;
functionfn1(){
num++;能改变num是因为这里找不到,去父级找,进而修改。
}
functionfn2(){
num--;
}
fn2();
fn1();
fn2();
alert(num);//-1
*/
/*想要获取函数内的值:至少两个方法
functionfn1(){
vara='大鸡腿~';
str=a;
}
fn1()
alert(a)显示不出来的,哪怕是加一个调用.调用之后也只是创建了一个局部变量而已。
直接报错,aisnotdefined
*/
varstr='';
functionfn1(){
vara='大鸡腿~';
str=a;
}
fn1();//函数不会自动执行,必须调用
//alert(str);巧妙利用全局变量
functionfn2(){
vara='9999999克拉钻石23456789';
fn3(a);//通过在里面调用的外部全局函数的方法从而获取函数内的值。
}
fn2();
functionfn3(b){
alert(b);
}//此函数是全局函数可以被内部访问。


//alert(a);//...undefined而不是aisnotdefined预解析中的。不一样
//if(true){vara=1};
alert(fn1);//FF不能对下面的函数进行预解析,会出现fn1isnotdefined
//只有火狐特殊在此,兼容性问题,正常应该是functionfn1(){alert(123);}
//定义全局变量全局函数那就挪出来,至于上下到无所谓。
vara=1;
functionfn1(){
alert(123);
}
if(true){
//vara=1;
//functionfn1(){
//alert(123);
//本义是未来定义全局变量全局函数}
}


<!DOCTYPEHTML>
<html>
<head>
<metahttp-equiv="Content-Type"content="text/html;charset=utf-8">
<title>无标题文档</title>
<script>
window.onload=function(){
varaBtn=document.getElementsByTagName('input');
for(vari=0;i<aBtn.length;i++){
aBtn[i].onclick=function(){
//aBtn[i].style.background='yellow';不仅没效果而且会报错
//alert(i);3……//函数for循环执行之后里面才可以点击,
//函数内部没有i(前提是下面函数没有,有的话会弹出undefined,因为下面有var预解析时给的,
//然后逐步执行),去父级找到i++变成的3。找到了3,如果下面省略了3那它弹出的又是3了
//for循环内部包一个函数,不可直接利用i,学了闭包才行,很多人会把闭包作用域混杂了
for(vari=0;i<aBtn.length;i++){
aBtn[i].style.background='yellow';
}//所以要再来一个for循环才能找到012
//QQ:1056104999
//bbs.miaov.com
};
}
};
</script>
</head>
<body>
<inputtype="button"value="按钮1"/>
<inputtype="button"value="按钮2"/>
<inputtype="button"value="按钮3"/>
</body>
</html>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: