JavaScript词法分析和作用域闭包
- 在函数运行时 会进词法分析(预编译)
- 预编译做了哪些工作
- 分析参数
- 分析变量声明(分析带var的变量声明)
- 分析函数声明
- 如何分析变量声明?
- 答:对于var声明的变量 以
var str = ‘local’为例,分为 分析过程 和执行过程 先分析后执行 先分析var str即仅仅声明了一个str变量str变量此时没有赋值 值是undefined然后在进行执行过程
- 答:对于var声明的变量 以
/*var age = 22;
var num = 99;
function t(){
var num = 88;
var str = 'hello';
function a(){
var str = 'world';
alert(str);//world
alert(num);//88
alert(age);//22
}
a();
}
t();
@前端进阶之旅: 代码已经复制到剪贴板
/*var str = 'global';
function t(){
alert(str);//undefined
var str = 'local';//local
alert(str);
//词法分析
var str;
//执行语句
alert(str)
str = 'local'
alert(str)
}
t();
@前端进阶之旅: 代码已经复制到剪贴板
-
活动对象、激活对象 Active Object
-
AO上有哪些属性:
-
对于函数的AO属性来自三个方面
- 参数
- 局部变量声明
- 函数声明
-
在函数调用瞬间
AO这样形成 -
首先分析参数 把分析的的参数形成
AO属性 如果传来实参 则把实参赋给相应的属性 -
其次分析var声明 以
var str= hello为例 把str声明为AO的属性 值为undefined -
如果var声明的变量名与形参名称一致 不产生影响 因为
AO的str已经存在 -
最后分析函数声明,
function函数名(){}//有函数名 -
函数的变量有其作用域,引用某变量时,在某个范围内查询该变量,这个范围又在哪里?在AO上找 在函数调用的瞬间 会产生一个AO 这个AO对象的属性 即存储着该函数所能引用的到的变量
var str = 'global';
function t(age){
alert(age);//99
var age = 12;
alert(age);//12
}
t();
@前端进阶之旅: 代码已经复制到剪贴板
对上面的结果进行分析:
AO:{age:undefined} //词法分析得到 AO:{age:99} //实参赋值 AO.age属性 AO:{age:12} //修改AO.age的值
function f(age,hei){
var age;
alert(age);
function age(