Js查漏補缺-02

0x00 函數

  ·函數的實參數可以大於形參數,按照實參的順序賦值給形參,多餘的忽略;

  ·若函數的實參數小於形參數,則未賦值的形參值爲undefined;

  ·函數如果沒有return則返回undefined;

  ·arguments是函數的一個內置對象,其中儲存了傳遞的所有實參;

  ·arguments是僞數組,它可以按照索引並獲取值並且有length這個屬性,但是它沒有數組的一些方法,如pop();

0x01 作用域

es5的作用域爲函數作用域和全局作用域,但是有個問題,就是函數作用域會覆蓋全局作用域,例子如下

  <script>
     var a = 1;
     var fn = () => {
         console.log(a);
         if(-1){
             var a = 3;
         }
     }
     fn();
  </script>

 

  執行fn()輸出的並不是1,而是undefined,這是因爲在函數中函數作用域覆蓋了全局作用域。

  還有一個缺點就是循環中的變量泄露爲全局變量

  針對以上情況,es6標準定義了塊級作用域,使用let定義,外層作用域無法訪問到內層作用域,這樣上面所述的情況變得到了解決

  <script>
     let a = 1;
     let fn = () => {
         console.log(a);
         if(-1){
             let a = 3;
         }
     }
     fn();
  </script>

 0x02 函數作用域

  ·在函數內部直接賦值沒有聲明得變量也是全局變量

  ·在es5中內部函數訪問外部函數採取的是鏈式查找的方式決定取哪個值

  <script>
    var num = 10;
    var fn = () => { // 外部函數
        var num = 20;
        var fn1 = () => { // 內部函數
            console.log(num);
        }
    }
    fn();
  </script>

在本案例中輸出的num爲20,也就是按照鏈式查找的方法來取num的值

0x03 預解析

  ·Js引擎執行代碼分爲兩步,第一步是預解析,第二步纔是執行代碼

  ·Js預解析會將當前作用域的var function提到作用域的最前面

  ·Js預解析分爲兩個部分,變量提升(預解析)和函數(預解析)

  ·變量解析和函數解析都是將聲明提前到當前作用域的最前面,注意只是提升聲明

經典面試題

  <script>
    fn1();
    console.log(c);
    console.log(b);
    console.log(a);
    function fn1() {
        var a = b = c = 9;
        console.log(a);
        console.log(b);
        console.log(c);
    }
  </script>

 

注意,這裏的var a = b = c = 9;相當於var a = 9;b = 9; c = 9;所以b,c爲全局變量,這裏只定義了一個var。

0x04 構造函數

  ·構造函數的首字母要大寫

  ·構造函數不需要return即可返回結果

  ·調用構造函數必須使用new

  ·利用構造函數創建對象的過程叫做對象的實例化

  經典面試題-new一個對象做了哪幾件事

    ①在內存中創建一個新的空對象;

    ②this指向空對象

    ③執行構造函數中的代碼,爲這個對象附上屬性和方法;

    ④返回這個對象

0x05 對象遍歷

  對象遍歷可以使用for..in

 

  <script>
     let obj1 = {
         name : 'a',
         sex : '男',
         Hi : () =>{
           console.log('hi~my name is a');
         }
     }
     for (let k in obj1){
         console.log(k);
         console.log(obj1[k]);
     }
  </script>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章