函数表达式和闭包

针对JS高级程序设计这本书,主要是理解概念,大部分要点源自书内。写这个主要是当个笔记加总结

存在的问题请大家多多指正!

定义函数的两种方法

函数声明:

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

函数表达式:

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

函数声明提升:函数可以先用,声明在下面自动给提到上面来

函数表达式=后面的是匿名函数,又叫拉姆达函数,他一般可以被用来当成值使用(可以用来return)

递归

函数自己调用自己就叫递归,没啥好说的。当函数赋值给另一个函数时会导致重新调用函数名称不同而调用失败

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)
}
}

闭包

总结来说就是指有权限访问另一个函数作用域中的变量的函数

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

先看一波闭包的效果:

//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

javascript 函数表达和闭包的更多相关文章

  1. 深入理解javascript函数参数与闭包(一)

    在看此文章,希望先阅读关于函数基础内容 函数定义与函数作用域 的章节,因为这篇文章或多或少会涉及函数基础的内容,而基础内容,我放在函数定义函数作用域 章节. 本文直接赘述函数参数与闭包,若涉及相关知识 ...

  2. JavaScript函数表达式、闭包、模仿块级作用域、私有变量

    函数表达式是一种非常有用的技术,使用函数表达式可以无需对函数命名,从而实现动态编程.匿名函数,是一种强大的方式,一下总结了函数表达式的特点: 1.函数表达式不同于函数声明,函数声明要求有名字,但函数表 ...

  3. JavaScript 函数作用域和闭包

    函数作用域和闭包  词法作用域   它们在定义它们的作用域里运行,而不是在执行的作用域运行,但是只有在运行时,作用域链中的属性才被 定义(调用对象),此时,可访问任何当前的绑定.   调用对象     ...

  4. 剖析JavaScript函数作用域与闭包

    在我们写代码写到一定阶段的时候,就会想深究一下js,javascript是一种弱类型的编程语言,而js中一个最为重要的概念就是执行环境,或者说作用域.作用域重要性体现在哪呢?首先,函数在执行时会创建作 ...

  5. Javascript ----函数表达和形参实参

    1.函数是对象,函数名实际上是函数对象的指针 1.函数声明方式 (函数声明提前) function sum(num1,num2){return num1+num2;} 2.函数表达式 var sums ...

  6. 第八章:Javascript函数

    函数是这样一段代码,它只定义一次,但可能被执行或调用任意次.你可能从诸如子例程(subroutine)或者过程(procedure)这些名字里对函数概念有所了解. javascript函数是参数化的: ...

  7. JavaScript学习总结(二)——闭包、IIFE、apply、函数与对象

    一.闭包(Closure) 1.1.闭包相关的问题 请在页面中放10个div,每个div中放入字母a-j,当点击每一个div时显示索引号,如第1个div显示0,第10个显示9:方法:找到所有的div, ...

  8. JavaScript学习总结(三)——闭包、IIFE、原型、函数与对象

    一.闭包(Closure) 1.1.闭包相关的问题 请在页面中放10个div,每个div中放入字母a-j,当点击每一个div时显示索引号,如第1个div显示0,第10个显示9:方法:找到所有的div, ...

  9. javaScript函数与闭包

    js中函数也是对象,具有一切对象的特征,可以作为表达式给变量赋值,可以作为函数的形参,或者函数的返回值,函数内可以嵌套函数等等,函数内以声明方式定义的函数是局部函数,用表达式声明的函数则由赋值变量的性 ...

随机推荐

  1. 洛谷 P5564: [Celeste-B]Say Goodbye

    题目传送门:洛谷 P5564. 题意简述: 有 \(n\) 个点,染 \(m\) 种颜色,第 \(i\) 种颜色染恰好 \(cnt_i\) 个节点,满足 \(cnt_1+cnt_2+\cdots+cn ...

  2. 可迭代对象,迭代器对象,for循环

    迭代器:迭代的工具.迭代是更新换代,如你爷爷生了你爹,你爹生了你,迭代也可以说成是重复,并且但每一次的重复都是基于上一次的结果来的.如计算机中的迭代开发,就是基于软件的上一个版本更新.以下代码就不是迭 ...

  3. windows 上jenkins slave 执行脚本提示成功,但是没有运行

    控制台结果,但是脚本没有运行Started by user admin Building remotely on test_1110 in workspace D:\jenkins\workspace ...

  4. Sring StringBuffer StringBuilder封装类

    Sring StringBuffer StringBuilder封装类 一.String类常见方法的使用 字符串数据都是一个对象 字符串数据一旦初始化就不可以被改变 字符串对象都存储于常量池中,字符串 ...

  5. LeetCode 112. Path Sum路径总和 (C++)

    题目: Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up ...

  6. UrlRouting原理笔记

    UrlRouting路由流程: 添加路由:可以通过调用MapRoute().MapPageRoute(),它们内部都是创建Route对象,最终添加到RouteCollection中. 还可以使用[Ro ...

  7. appium--多点触控

    前戏 对于放大缩小的,我们使用前面的滑动是不行的,例如地图的放大缩小,这里就要用到多点触控了 MultiAction是多点触控的类,可以模拟多点触控操作,主要包含add()和perform()两个方法 ...

  8. BERT、ERNIE以及XLNet学习记录

    主要是对 BERT: Pre-training of Deep Bidirectional Transformers for Language Understandingtichu提出的BERT 清华 ...

  9. [LeetCode] 883. Projection Area of 3D Shapes 三维物体的投影面积

    On a N * N grid, we place some 1 * 1 * 1 cubes that are axis-aligned with the x, y, and z axes. Each ...

  10. VS2017 高级使用方法

    如何离线安装,创建脱机安装 - Visual Studio | Microsoft Docs 如离线下载C++桌面开发(VS中英版本) E:\0User_File\Downloads>vs_co ...