js的预编译
tips:
1.如果变量未经声明就赋值,此变量就为全局变量所有。
function test(){
var a = b = 123; //因为这里变量b没有声明
}
test();
console.log(window.a) //undefined
console.log(b) //123
2.一切声明的全局变量,全是window的属性。
var a = 123 ===> window.a = 123
预编译四部曲:
1. 创建AO对象。
2.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined。
3.将实参值和形参统一。
4.在函数体里面找函数声明,值赋予函数体。
例1:
//预编译发生在函数执行的前一刻
function fn(a){
console.log(a);
var a = 123;
console.log(a);
function a(){}
console.log(a);
var b = function(){}
console.log(b);
function d(){}
}
fn(1);
第一步创建AO对象:
AO{
}
第二步找形参和变量声明,将变量和形参名作为AO属性名,值为undefined:
AO{
a:undefined,
b:undefined,
}
第三步将实参值和形参统一:
AO{
a:1,
b:undefined,
}
第四步在函数体里面找函数声明,值赋予函数体:
AO{
a:function a(){},
b:undefined,
d:function d(){},
}
预编译之后,函数才开始执行,结果如下:
function a(){}
123
123
function (){}
例2:
function bar(){
return foo;
foo = 10;
function foo(){
}
var foo = 11;
}
console.log(bar());
例3:
console.log(bar());
function bar(){
foo = 10;
function foo(){
}
var foo = 11;
return foo;
}
例4:
a = 100;
function demo(e){
function e(){}
arguments[0] = 2; //修改形参
console.log(e);
if(a) {
var b = 123;
function c(){
//if里面最好不要定义function
}
}
var c;
a = 10;
var a;
console.log(b);
f = 123;
console.log(c);
console.log(a);
}
var a;
demo(1);
console.log(a);
console.log(f);
原文地址:https://blog.csdn.net/weixin_61810048/article/details/140207803
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!