第七章 函数表达式(js高级程序设计)

2019-03-04  本文已影响0人  简默丶XS
say()
function say(){

}
fun ();//error 函数表达式不存在函数变量提升
var fun = function(){
  //这个function是匿名函数
}

递归

function factorial(num){ 
 if (num <= 1){ 
 return 1; 
 } else { 
 return num * arguments.callee(num-1); 
 } 
} 
var factorial = (function f(num){ 
 if (num <= 1){ 
 return 1; 
 } else { 
 return num * f(num-1); 
 } 
}); //即使是修改了factorial变量名函数内部也能调用到f()命名函数

闭包

闭包与变量

  function createFunctions() {
    debugger
    var result = new Array();
    for (var i = 0; i < 10; i++) {
      result[i] = function () {
        return i;
      };
    }
    i = 2 //将i重新赋值为2,则返回结果都是2
    return result;
  }
  const a = createFunctions()
  console.log(a[0]())//2
  console.log(a[5]())//2

关于this对象

  1. 全局下指向window
  2. 对象中函数执行对象
  3. 匿名闭包函数的this指向全局window(每个函数在被调用时都会自动取得两个特殊变量:this 和 arguments。内部函数在搜索这两个变量时,只会搜索到其活动对象为止,因此永远不可能直接访问外部函数中的这两个变量)

闭包带来的内存泄露

function assignHandler(){ 
 var element = document.getElementById("someElement"); 
 var id = element.id; 
 
 element.onclick = function(){ 
 alert(id); 
 }; 
 
 element = null; 
} 

模仿块级作用域

function outputNumbers(count){ 
 (function () { 
   for (var i=0; i < count; i++){ 
     alert(i); 
   } 
 })(); 
 
 alert(i); //导致一个错误!
} 

私有变量(闭包还可以用在对象创建私有变量)

静态私有属性:在私有作用域中用原型返回私有属性

模块模式:如果必须创建一个对象并以某些数据对其进行初始化,同时还要公开一些能够访问这些私有数据的方法,那么就可以使用模块模式。和闭包差不多,就是返回了个对象

  var application = function () {
    //私有变量和函数
    var components = new Array();
    //初始化
    components.push(new BaseComponent());
    //公共
    return {
      getComponentCount: function () {
        return components.length;
      },
      registerComponent: function (component) {
        if (typeof component == "object") {
          components.push(component);
        }
      }
    };
  }();

增强的模块模式

  var application = function () {
    //私有变量和函数
    var components = new Array();
    //初始化
    components.push(new BaseComponent());
    //创建 application 的一个局部副本
    var app = new BaseComponent();
    //公共接口
    app.getComponentCount = function () {
      return components.length;
    };
    app.registerComponent = function (component) {
      if (typeof component == "object") {
        components.push(component);
      }
    };
    //返回这个副本
    return app;
  }();
上一篇 下一篇

猜你喜欢

热点阅读