1 console.log(a); // undefined 2 var a = 12; // 12 3 function fn() { 4 console.log(a); // undefined 5 var a = 13; // 13 6 } 7 fn(); 8 console.log(a); // 12
1 console.log(a); // undefined 2 var a = 12; // 12 3 function fn() { 4 console.log(a); // 12 5 a=13; // 13 6 } 7 fn(); 8 console.log(a); // 13
9 // 結果爲 undefined 、12 、13
1 console.log(a); // a is not defined 2 3 a=12; 4 function fn() { 5 console.log(a); 6 a = 13; 7 } 8 fn(); 9 console.log(a); 10 // a is not defined
1 var foo = 1; 2 function bar () { 3 /** 4 * 形參賦值:無 5 * 變量提高 6 * var foo 7 */ 8 if (!foo) { // ==> !undefined ==> true 9 var foo = 10; 10 } 11 console.log(foo);// foo => foo 12 }
1 var n = 0; 2 function a() { 3 var n = 10; 4 function b() { 5 n++; 6 console.log(n); 7 console.log(this); 8 } 9 b(); 10 return b; 11 } 12 var c = a(); 13 c(); 14 console.log(n); 15 16 // --------------------------------- 17 // 建立全局做用域 n、 c、a(a =>> 指向函數堆棧的地址 ) 18 // 開始執行 n = 0; c = a() 此過程會把 a 執行結果賦值給 c 變量); 19 // 執行 a() 時候,建立私有 window.a 做用域,有變量 n、 b (b =>> 指向函數堆棧的地址 000111) 20 // 開始執行 n = 10; b(); 21 // 執行 b() 時候,建立 window.a.b 做用域,變量爲 n 取自上級做用域 a.n; 22 // 執行 n++; console.log(n);( n => 10 + 1; console.log(11);) 23 // 以後 a.b 做用域會銷燬,由於此做用域在其餘處未被引用 24 // return b; (b => 函數堆棧的地址 000111) 25 // var c = a (); 會把 a 做用域中的 b 值賦給變量 c, 因此 a 做用域不銷燬。 26 // 開始執行 c(); 27 // 造成 c 時候,建立私有做用域,有變量 n 取自上級做用域仍是 a.n ; 28 // 執行 n++; console.log(n);( n => 0 + 1; console.log(1);) 29 30 // 函數做用域只和在哪裏建立有關,和在哪裏執行沒有關係。