标签:function 20 作用域 AO js 词法 var alert
先来看个常见的面试题如下:
var a = 10;
function test(){
alert(a); //undefined
var a = 20;
alert(a); //20
}
test();
疑问:为什么呢?test()执行时,虽然a=20没有赋值,但是父级作用域里是有a=10的,不应该是undefined呀,js是按顺序执行的,此时的var num = 20;根本没有执行,所以应该是10!!你是不是也是这么认为的,就和我当初一样???
分析:众所周知,js代码是自上而下执行的,JavaScript并不是传统的块级作用域,而是函数作用域。JavaScript引擎会在代码执行前进行词法分析,所以事实上,js运行分为此法分析和执行两个阶段。
JavaScript代码运行前有一个类似编译的过程即词法分析,词法分析主要有三个步骤:
分析参数
再分析变量的声明
分析函数声明
具体步骤如下:
函数在运行的瞬间,生成一个活动对象(Active Object),简称AO
第一步:分析参数:
函数接收形式参数,添加到AO的属性,并且这个时候值为undefined,即AO.name=undefined
接收实参,添加到AO的属性,覆盖之前的undefined
第二步:分析变量声明:如var name;或var name='mary';
如果上一步分析参数中AO还没有name属性,则添加AO属性为undefined,即AO.name=undefined
如果AO上面已经有name属性了,则不作任何修改
第三步:分析函数的声明:
如果有function name(){}把函数赋给AO.name ,覆盖上一步分析的值
分析下面这个栗子:
1.var a = 10;
2.function test(a){
3. alert(a); //function a (){}
4. var a = 20;
5. alert(a); //20
6. function a (){}
7. alert(a); //20
8. }
9.
10.test(100);
词法分析:
第一步,分析函数参数:
形式参数:AO.a = undefined
接收实参:AO.a = 100
第二步,分析局部变量:
第4行代码有var a,但是此时已有AO.a = 100,所以不做任何修改,即AO.a = 100
第三步,分析函数声明:
第6行代码有函数a,则将function a(){}赋给AO.a,即AO.a = function a(){}
执行代码时:
第3行代码运行时拿到的a时词法分析后的AO.a,即AO.a = function a(){};
第4行代码:将20赋值给a,此时a=20;
第5行代码运行时a已经被赋值为20,结果20;
第6行代码是一个函数表达式,所以不做任何操作;
第7行代码运行时仍是20;
ps:
1.var a = 10;
2.function test(a){
3. var a; //证明词法分析第二步。
4. alert(a); //100
5. a = 20;
6. alert(a); //20
7.}
7.test(100);
ps:
var a = 10;
function test(a){
alert(a); //100
var a = 20;
alert(a); //20
a = function(){} //是赋值,只有在执行时才有效
alert(a); //function(){}
}
test(100);
ps:(执行结果同上)
var a = 10;
function test(a){
alert(a); //100
var a = 20;
alert(a); //20
var a = function(){} //是赋值,只有在执行时才有效
alert(a); //function(){}
}
test(100);
补充说明:函数声明与函数表达式
//函数声明
function a(){
}
//函数表达式
var b = function(){
}
a和b在词法分析时,区别:
a在词法分析时,就发挥作用;
b只有在执行阶段,才发挥作用。
词法作用域
所谓词法作用域是说,其作用域为在定义时(词法分析时)就确定下来的,而并非在执行时确定。白话就是在函数未执行前,函数执行的顺序已经被确定,而不是类似JAVA一样,是在执行前根本不知道执行顺序。
标签:function,20,作用域,AO,js,词法,var,alert 来源: https://www.cnblogs.com/jlfw/p/12220737.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。