js预编译
步骤
先分析整个页面,然后逐一执行。此时会产生GO对象,Global Object对象。
GO对象
1、将所有变量作为GO的属性,值均为undifined
2、将函数声明也作为GO的属性,值为函数体。当函数声明和变量名相同时,覆盖第一步
执行函数时,产生AO对象,Actived Object对象。
1、将多有变量,形参作为AO的属性,值均为undifined
2、实参的值赋给形参
3、将函数声明作为AO的属性,值为函数体,同样若与变量相同则覆盖
总结
预编译的四部曲:
1.创建GO(global object)/AO(active object)对象
2.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
3.将实参值和形参统一
4.在函数体里面找函数声明,值赋予函数体
DEMO
function f(a){
console.log(a);
var a=123;
console.log(a);
function a(){}
var b=function(){}
function d(){}
}
f(1)
代码分析:
1.创建AO对象
AO={}
2.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
AO={
a:undefined,
b:undefined
}
3.将实参值和形参统一
AO={
a:1,
b:undefined
}
4.在函数体里面找函数声明,值赋予函数体:由于在函数中有 function a() {} ,这一函数因此此时AO中 a = function a() {}
AO={
a:function a(){},
b:undefined,
d:function d(){}
}
然后代码依次执行,第一个console时取AO中的a为function a(){},然后a=123,改变AO中的a
AO={
a:123,
b:undefined,
d:function d(){}
}
接着打印a为123
附带京东面试题
var name = 'Tom';
(function() {
if (typeof name == 'undefined') {
var name = 'Jack';
console.log('Goodbye ' + name);
} else {
console.log('Hello ' + name);
}
})();
变形一
var name = 'Tom';
(function(name) {
if (typeof name == 'undefined') {
var name = 'Jack';
console.log('Goodbye ' + name);
} else {
console.log('Hello ' + name);
}
})(name);
变形二
var name = 'Tom';
(function() {
if (typeof name == 'undefined') {
let name = 'Jack';
console.log('Goodbye ' + name);
} else {
console.log('Hello ' + name);
}
})();
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。