2024 js预编译
1、一切未声明定义的变量(没有var)是全局变量属于window全局域
2、全局声明定义的变量是全局变量属于window全局域
function test() { var a = b = 123 } test() //console.log(a)//报错 a is not defined console.log(window.a) //undefined console.log(b, window.b) //123 123 b未声明直接赋值 var aa = 1234 console.log(aa, window.aa) //1234 1234
3、1、创建一个AO对象 2、找形参和变量声明,将变量和形参名作为AO属性名,值 为undefined 3、将实参值和形参统一 4、在函数体里找函数声明,将函数名作为AO属性名,值为函数体本身
function fn(a) { console.log(a) //ƒ () { console.log(333) } var a = 123; console.log(a) //123 function a() { } console.log(a) //123 var b = function () { console.log(333) } console.log(b) //ƒ () { console.log(333) } function d() { } } fn(1) //预编译发生在函数执行前一刻 //预编译:1、创建一个AO对象 AO={} 2、找形参和变量声明,将变量和形参名作为AO属性名,值 为undefined AO={a:undefined,b:undefined}3、将实参值和形参统一 AO={a:1,b:undefined} 4、在函数体里找函数声明,将函数名作为AO属性名,值为函数体本身 AO={a:function a() {},b:undefined,d:function d(){}} //执行函数体(函数和变量声明可以不看):1、console.log(a) 从AO找a:function a() {}; 2、var a = 123; 给AO中属性a重新赋值AO={a:123,b:undefined,d:function d(){}} 3、console.log(a) 从AO找a:123; 4、console.log(a) 从AO找a:123; 5、var b = function () { } 给AO中属性b重新赋值AO={a:123,b:function () { },d:function d(){}}5、console.log(b) 从AO找b:function () { };
function test(a, b) { console.log(a) //1 c = 0 var c; a = 3 b = 2 console.log(b) //2 c=0 a=3 b=2 这样未声明直接赋值的变更 如果test AO中没有相关的属性则将放于GO(window) function b() { } function d() { } console.log(b) //2 } test(1)