/** * 函数声明整体提升 */ test() //aa function test() { console.log("aa") } /** * 变量声明 变量提升(赋值不提升 */ var a = 123; console.log(a) //123 console.log(a); //undefined var a = 123 console.log(a) //undefined console.log(b) //报错 b is not defined var a = b = 123; console.log(a) //123 console.log(b) //123 /** * 123赋值给b,声明a,然后b赋值给a * 所以b是未声明变量,所以是全局的 window.b */ function test() { var a = b = 123; } function abc() { console.log(b) } test() abc() //123 /** * 预编译 * 创建AO对象 * 找形参和变量声明,将变量和形参名作为AO对象属性名,值为undefined * 将实参值与形参统一 * 在函数体里找函数声明 */ /** * 例子 * @param a */ 第一步与第二步 AO{ a:undefined b:undefined } 第三步 将实参与形参的值相统一 AO{ a:1 b:undefined } 第四步 在函数体里找函数声明 AO{ a:function a(){} b:undefined //b不赋值是因为b是函数表达式不是函数声明 } function fn(a) { console.log(a) // function a(){} var a = 123; console.log(a) //123 function a() {} console.log(a) //123 var b = function () {} console.log(b) //function(){} } fn(1) function test(a,b) { console.log(a) //1 c = 0; var c ; a = 3; b= 2; console.log(b) //2 function b() { } console.log(b); //2 } test(1) function test(a,b) { console.log(a) //function console.log(b) //undefined var b = 234 console.log(b) //234 a=123; console.log(a) //123 function a() { } var a; b=234 var b = function () { } console.log(b) //function } test(1) console.log(test) //function function test(test) { console.log(test) //function var test = 234; console.log(test) //234 function test() { } } test(1) var test = 123; console.log(bar()) function bar() { foo = 10; function foo() { } var foo = 11; return foo //return 就可以看成是console.log(foo) } if(11+"11"*2==33){ document.write("基础扎实") } !!" "+!!"" - !!false||document.write("是猪")