javascript 函数表达和闭包

函数表达式和闭包

针对JS高级程序设计这本书,主要是理解概念,大部分要点源自书内。写这个主要是当个笔记加总结
存在的问题请你们多多指正!javascript

定义函数的两种方法

函数声明:java

function functionName(arg0,arg1,arg2){
  //函数体
}

函数表达式:闭包

var  functionName = function(arg0, arg1, arg2){
  //函数体
}

函数声明提高:函数能够先用,声明在下面自动给提到上面来函数

函数表达式=后面的是匿名函数,又叫拉姆达函数,他通常能够被用来当成值使用(能够用来return)设计

递归

函数本身调用本身就叫递归,没啥好说的。当函数赋值给另外一个函数时会致使从新调用函数名称不一样而调用失败code

var anotherFactorial = factorial //factorial是一个递归函数
factorial = null 
alert(anotherfactorial(5))//error

因此在函数内部本身调用本身的时候不要使用本身的函数名,应该用耦合度更大的arguments.callee来表示本身的函数名,例如对象

fucntion factorial(num){
  if(num <= 1){
    return 1
  } else {
    //此处arguments.callee代替函数名factorial
    return num * arguments.callee(num-1)
  } 
}

闭包

总结来讲就是指有权限访问另外一个函数做用域中的变量的函数递归

常见的方式就是在一个函数内部建立另外一个函数。ip

先看一波闭包的效果:内存

//creatComparisonFunction是下面要说的外层函数
var compareNames = creatComparisonFunction('name')
//compareNames在调用的就是闭包函数方法了,为何对象可以使用方法,由于闭包返回的是一个方法
var result = compareNames({ name: 'laotie' },{ name: '6666'})

仔细的说的话在一个函数里的return出来的匿名函数就叫闭包。在做用域链中一个函数内部的函数能够访问他链后面(链后面指当前活动对象的外层,也就是内层函数外层的函数)对象的参数,然而当外面函数执行完了,里面的函数就不能再去调用外层函数的数据了,这是由于当一个函数执行完毕时,局部活动的对象就会被销毁,当外层函数执行完后里不只内层函数被销毁,顺带着外层函数的数据也被销毁了。然而经过闭包能够实现一种效果,外层函数执行完了之后,内层函数再次调用的话还能够调用外层函数的属性。

由于太抽象了,因此书中给了一个例子:

//createComparisonFunction 就是一个外层函数,他传进来一个propertyName的参数
function createComparisonFunction(propertyName){
  
  return function(object1,object2){
    //这时候内层调用了外层的参数,理论上不用闭包也行的,可是闭包的目的是当外层函数执行完了,还能够有机会去执行内层函数并使用外层函数的参数
    var value1 = object1[propertyName]
    var value2 = object2[propertyName]
    
    if(value1 < value2){
      return -1
    } else if (value1 > value2){
      return 1
    } else {
      return 0
    }
  }
}

上面例子中return 的function就是闭包函数,闭包实现'外层函数执行完了之后,内层函数再次调用的话还能够调用外层函数的属性的'这种效果主要是由于匿名函数的做用域链中包含他的外层函数,由于匿名函数的做用域链始终引用着他外层函数的活动对象,因此除非接触匿名函数的引用,不然外层函数的活动对象会一直存在。这也引发来闭包会比较占内存,因此要慎重使用。

//跟上第一个例子:解除对匿名函数的引用
compareNames = null
相关文章
相关标签/搜索