昨天小优跟大家详细介绍了php中字符替换函数,今天我们来了解js作用域与词法:
作用域由里向外
内层的函数可以访问外层函数的东西(如变量、函数等)
function t1(){
var str1="aaaa";
function t2(){
var str2="bbbb";
console.log(str1); //访问t1中的str1
}
t2();
console.log(str2); //t1中访问t2中的str2
}
t1();
执行结果:aaaa uncaught ReferenceError: Console is not defined
词法分析
主要分析三样东西,这里说的是函数
A.参数
B.变量声明
C.函数声明
在函数执行前函数会先做词法分析:
一、生成一个Active Object对象(活动对象),检查AO对象
二、形参会形参AO的属性,值全部等于undefined,接下来接收实参,此时属性的值是接收的实参
三、函数内变量的声明(是声明而不是赋值,如var a=5而不是a=5)也形成AO的属性
四、分析函数的声明,形成AO的属性(如 function t(){},就会形成AO.t)
例子1:
function t(x){
console.log(x);
}
t(2);
t();
执行结果:2 undefined
经过词法分析可得到函数参数X=undefined
运行t(2) 2替换了 undefined 而t()没有传值,因此X还是等于undefined
例子2:
function t(fun){
var fun;
console.log(fun);
function fun(){
}
console.log(fun);
}
t(null);
分析过程
生成AO对象
AO.fun=undefined
声明变量fun
声明函数,形成AO.fun=function(){},到此原来的undefined被覆盖
分析完后执行:两个console.log(fun),因此结果是打印:function fun() function fun()
例子3:
function t(fun){
var fun=”aaaa”;
console.log(fun);
function fun(){
}
console.log(fun);
}
t(null);
分析过程
生成AO对象
AO.fun=undefined
声明变量fun (注意这里的赋值过程不再词法分析的范围内)
声明函数,形成AO.fun=function(){},到此原来的undefined被覆盖
分析完后执行:赋值 和console.log(fun),因此结果是打印:aaaa aaaa
责任编辑:途必技术部
版权所有:http://www.uweb.net.cn (优网科技) 转载请注明出处