• 函数声明 有提升 而函数表达式没有,因此不应该通过if…else来声明函数

    if (condition) {

      function sayHi() {}
    

    } else {

      function sayHi() {}
    

    }

  • 在递归函数中使用arguments.callee可以避免因函数名改变产生的错误。

    function factorial(num) {

      if (num <= 1) {
          return 1;
      } else {
          return num * arguments.callee(num - 1);
      }
    

    }

  • 闭包是指函数中定义的函数,闭包的作用域链中包含父函数的执行环境(变量对象),所以即使父函数退出,如果闭包仍然被引用,那么父函数的变量对象就一直存在于内存中。所以,过度的使用闭包会导致内存占用过多

  • 闭包的另外一个副作用是闭包只能取得父函数中变量的最后一个值,例如:
    function createFunctions() {

      var result = new Array();
      for(var i = 0; i < 10; i++) {
          result\[i\] = function() {
              return i;
          }
      }
      return result;
    

    }
    调用result中的每个函数都会返回10

  • 闭包如果是匿名函数,则该函数中的this指向全局对象

  • 可以用定义一个立即执行函数来模仿块级作用域:
    (function(){
    //块级作用域
    })();