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>

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