# 11-04

参考:

进度:

  • 在 V8(Chrome,Edge,Opera)中,如果从代码中可以明显看出有未使用的外部变量,那么就会将其删除,这会导致此类变量在调试中不可用

    let value = "Surprise!";
    
    function f() {
      let value = "the closest value";
    
      function g() {
        debugger; // 在 console 中:输入 alert(value); Surprise!
      }
    
      return g;
    }
    
    let g = f();
    g();
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
  • 所有的 var 声明都是在函数开头处理的(“提升”),可以在任何地方引用它们。但是在它们被赋值之前都是 undefined,赋值操作不会被“提升”。

    function sayHi() {
      alert(phrase); // undefined
    
      var phrase = "Hello";
    }
    
    sayHi();
    
    1
    2
    3
    4
    5
    6
    7
  • 在浏览器中,除非使用 modules,否则使用 var(而不是 let/const)声明的全局函数和变量会成为全局对象的属性。

    var gVar = 5;
    
    alert(window.gVar); // 5(成为了全局对象的属性)
    
    1
    2
    3
  • 可以把函数当作对象,在它里面存储属性,但是这对它的执行没有任何影响。变量不是函数属性,反之亦然。它们之间是平行的。

  • 函数对象属性name是“上下文命名”的,如果函数自己没有提供,那么在赋值中,会根据上下文来推测一个。若无法推测则为空。

  • 函数对象属性length 为函数定义时的入参的个数。Rest 参数不参与计数。

  • 如果函数是通过函数表达式的形式被声明的,并且附带了名字,那么它被称为命名函数表达式(Named Function Expression)。这个名字可以用于在该函数内部进行自调用,例如递归调用等。它在函数外是不可见的。

    let sayHi = function func(who) {
      if (who) {
        alert(`Hello, ${who}`);
      } else {
        func("Guest");     
        //通过内部名 func 调用自己
      }
    };
    
    let welcome = sayHi;
    sayHi = null;          
    //原变量被修改
    
    welcome();             
    // Hello, Guest(嵌套调用仍然有效,如不使用 NFE 则报错)
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
上次更新: 11/8/2020, 2:44:59 AM