码迷,mamicode.com
首页 > 编程语言 > 详细

Javascript scrope

时间:2015-08-28 10:59:51      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:

作用域:顾名思义,就是能发生读写等操作的环境;但是又没这么简单,下面就来仔细撸一撸JS中的作用域。
浏览器内部有读取JS的某段程序,当一段JS代码在浏览器中读到的时候,简单的来说会发生以下几个步骤:

1)预解析:在代码解读之前发生,相当于一个"仓库",放一些东西,var、function、参数等,预解析时变量都是未定义的,函数则是整个函数块。当代码在一个环境中执行时,会创建变量对象的一个作用域链。是域就要预解析。

2)解读代码:代码自上而下,从左往右的执行,读到表达式时,预解析仓库中的东西发生改变。

实例:
[js]
alert(a);// 报错
a=1;
[/js]
预解析时由于没有var、function、函数参数等,所以仓库为空。代码自上而下执行时报错。
[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
a();// 报错 a() => 3(),number is not a function;*/
[/js]
预解析时遇到重名的,只留一个。变量与函数,留函数;函数与函数,留后解析的。最后仓库里面有:a=function a(){alert(4);}函数块。
代码执行读到表达式,仓库内容改变,a变为表达式所赋予的值。然后接着读代码。
<div class="sc_error">*注意:function fn1(){}是函数声明,没有调用,所以不执行。</div>
[js]
var a=1;
function fn1(){
alert(a); // undefined
var a=2;
}
fn1();
alert(a); // 1
[/js]
预解析仓库有:a=undefined、fn1=function fn1(){alert(a);var a=2;}
代码读到fn1()时,调用函数,函数内部发生预解析:
---a=1 fn1=function fn1(){alert(a);var a=2;}
------------undefined
继续执行,弹出undefined。
<div class="sc_error">*注意 :函数内部 var a=2 是局部变量,不影响全局变量。</div>
全局执行环境是最外围的一个执行环境,根据ECMAScript实现所在的宿主环境不同,表示执行环境的对象也不一样,在web浏览器中,全局执行 环境被认为是windows对象;每个函数都有自己的执行环境。
[js]
var a=1;
function fn1(){
alert(a); // 1 子级找不到;向父级找;由里到外; 作用域链
a=2; // 全局变量,改变值
}
fn1();
alert(a); // 2
[/js]
在子级执行环境中找不到变量,会沿着作用域链一级一级向外搜索,找到为止,找不到报错。
<div class="sc_error">*注意:不声明而直接初始化的变量是全局变量,不推荐。</div>
[js]
var a=1;
function fn1(a){
alert(a); // undefined
a=2;//改变局部变量
}
fn1();
alert(a); // 1
[/js]
预解析仓库:a=undefined fn1=function fn1(a){alert(a);a=2;}
读到fn1()时,调用函数,函数预解析
---a=1 fn1=function fn1(a){alert(a);a=2;}
-----------参数a=undefined
继续执行,弹出undefined、弹出1。
<div class="sc_error">*注意:函数参数是局部变量,fn1(a) =&gt; fn1(var a=undefined)</div>
[js]
var a=1;
function fn1(a){ // 参数a =&gt; var a=1
alert(a); // 1 这个a不是外面的a;这个是局部的
a=2; // 就近原则,改变了局部的a
}
fn1(a);
alert(a); // 1
[/js]
相当于
[js]
var a=1;
function fn1(b){ //参数b =&gt; var b=a=1
alert(b); //1
b=2;
}
fn1(a);
alert(a); // 1
[/js]
当在某个环境中为了读取或写入而引用了一个标识符,必须通过搜索来确定该标识符实际代表什么,搜索过程从作用域链的前端开始,向上级查询与给定名字匹配的标识符。作用域链的前端,始终都是当前执行的代码所在的环境的变量对象,作用域链的下一个变量对象来自包含(外部)环境,而再下一个变量对象则来自下一个包含环境。这样,一直延续到作用域链的最后一个对象,即全局执行环境。

Javascript scrope

标签:

原文地址:http://www.cnblogs.com/aadega/p/4765793.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!