js 面試題總結 3

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. 建立全局做用域;
  2. 變量提高,聲明一個 a 變量、定義一個函數 fn;
  3. 執行代碼;( 變量 a 已提高但未賦值,因此 a = undefined,輸出 a 值爲 undefined,設置 全局變量 a = 12 )
  4. 執行 fn,造成一個私有做用域 fn ;
  5. 私有做用域中的執行過程爲:
    1)形式參數賦值。沒有形式參數;
    2)變量提高。提高變量 a ;(私有做用域中,若是定義了變量,那麼全部的相同變量名都是同一個)
    3)執行代碼。局部變量 a已提高還未賦值,因此是 undefined,輸出 a 值爲 undefined,設置局部變量 a = 13 ;
  6. 輸出全局變量 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 // 函數做用域只和在哪裏建立有關,和在哪裏執行沒有關係。
相關文章
相關標籤/搜索