JavaScript 预编译习题
- 预编译的事件
作用域的创建阶段,就是预编译的阶段 - AO对象
我们都知道Js中有全局作用域和函数作用域,与之对应的叫’js的变量对象’,在函数作用域的创建阶段也叫AO对象, 这个对象供js引擎自己访问,我们无法访问 - 预编译时做了什么
1、创建ao对象------> 2、找形参和变量的声明 作为AO对象的属性名 值是undefined------> 3、实参和形参统一------> 4、找函数声明,如果函数名和之前变量名相同,将覆盖原有 - 题目
function fn(a,c){
console.log(a);
var a = 123;
console.log(a);
console.log(c);
function a(){};
if(false){
var d = 678;
}
console.log(d);
console.log(b);
var b = function(){};
console.log(b);
function c(){};
consolo.log(c)
}
fn(1,2)
- 解题思路
1、根据预编译过程生成AO对象
1\创建ao对象 2\找形参和变量的声明 作为AO对象的属性名 值是undefined
AO:{
a:undefined,
c:undefined,
b:undefined,
d:undefined
}
2\实参和形参统一
AO:{
a:~~undefined~~ 1,
c:~~undefined~~ 2,
b:undefined,
d:undefined
}
3\找函数声明,如果函数名和之前变量名相同,会覆盖
AO:{
a:~~undefined~~ ~~1~~ function a(){},
c:~~undefined~~ ~~2~~ function c(){},
b:undefined,
d:undefined
}
注意:var b = function(){};是函数的表达式而不是函数声明
2、JS的解释执行 逐行执行 得出答案
function fn(a,c){
console.log(a); //function a(){}
var a = 123;
console.log(a); //123
console.log(c);//function c(){}
function a(){};
if(false){
var d = 678;
}
console.log(d);//undefined
console.log(b);//undefined
var b = function(){};
console.log(b);//function(){};
function c(){};
console.log(c)//function c(){}
}
fn(1,2)
致自己:足够的努力,才能毫不费力