首页 > 其他 > 详细

第7章-函数表达式

时间:2020-03-11 00:06:27      阅读:60      评论:0      收藏:0      [点我收藏+]

摘要

  • 函数表达式的特征
  • 使用函数实现递归
  • 使用闭包定义私有变量


    定义函数的方式有两种:函数声明和函数表达式。
    函数声明和函数表达式一个重要区别是 函数提升方式不同。
    函数声明存在函数提升,因此可以在声明函数之前调用函数,并且不会出错。
fun()
function fun(){
  console.log('可以运行哦!')
}

但是函数表达式提前调用会报错

fun1()  //会报错,fun1 is not a function
var fun1=function(){
  console.log('不可以在此之前调用函数fun1哦')
}

这是因为函数表达式中,fun1会执行变量提升,因此在赋值之前提升为var fun1=undefined 因此在函数表达式之前调用会出错。

递归


递归是函数通过名字调用自身的情况下构成的,接下来依次介绍函数声明和函数表达式在递归上的使用。

函数声明结构如下

function fib(n){
  if(n===1 || n===2){
    return n
  }else{
    return fib(n-1)+fib(n-2)
  }
}
console.log(fib(9))

但是使用函数表达式的时候会存在一些问题

function fib(n){
  if(n===1 || n===2){
    return n
  }else{
    return fib(n-1)+fib(n-2) // 在fib赋值为null的时候会出错
  }
}
var fib1=fib
fib=null  
console.log(fib1(9))

此时,可以使用arguments.callee()来解决这个问题,arguments.callee()指向正在运行的函数。但是在严格模式下会出错。可以通过一个匿名函数来解决

function fib(n){
  if(n===1 || n===2){
    return n
  }else{
    return arguments.callee(n-1)+arguments.callee(n-2)
  }
}
var fib1=(fib)
fib=null
console.log(fib1(9))

// 使用命名函数解决这一问题
var fib2=(function f(n){
  if(n===1 || n===2){
    return n
  }else{
    return f(n-1)+f(n-2)
  }
})
console.log(fib2(9))

闭包

闭包是指有权限访问另一个函数作用域中变量的函数

  • 执行环境:在函数执行的时候,会为函数创建一个执行环境,根据作用域链来查找有效变量。
  • 变量对象:每一个执行环境,都有一个表示变量的对象,叫变量对象,局部环境的变量对象,只在执行的过程中存在,但是闭包比较特殊,其作用域链上的变量对象会一直存在,知道被闭包被回收(bibao=null),而全局环境的变量对象始终存在。
  • 作用域链:在创建函数的时候就创建了一个作用域链,作用域链的本质是一个指向变量对象的指针。
关于this对象

全局函数中的this指向window,当函数被作为某个对象的方法调用时,this等于那个对象,但是匿名函数的执行环境具有全局性,其this通常指向window。

要想使得匿名函数指向其外部函数的this,可在其外部定义一个变量指向this,在闭包内部引用该变量。如下:

var name="window"
var obj={
  name:'obj',
  getName:function(){
    var that=this
    return function(){
      console.log(that.name)
      /**
       * 注意这段代码如果在node环境下运行时,会输出undefined
       */
    }
  }
}

小结

  • 对闭包的理解
    当在函数内部定义了其它函数时,就创建了闭包。闭包有权访问包含函数内部的所有变量,原理如下:
    在后台执行环境中,闭包的作用域包含着他自己的作用域、包含函数的作用域和全局作用域。
    通常,函数的作用域及其所有的变量都会在函数指向结束后被销毁。
    但是,当函数返回一个闭包时,这个函数的作用域将会一致在内存中保存到闭包不存在为止。
  • 闭包的作用
    模仿块级作用域
    创建私有变量

第7章-函数表达式

原文:https://www.cnblogs.com/ailingstar/p/12459354.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!