函数表达式和闭包

针对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. JS高阶---显式原型和隐式原型

    前言: 1.函数对象即函数的prototype原型属性指向原型对象,在创建函数时便存在,默认为空Object 2.实例对象的__proto__隐式原型在实例化创建实例时产生,值等于构造函数的显式pro ...

  2. SQLAlchemy(3)

    一. SQLAlchemy 介绍 SQLAlchemy是一个基于Python实现的ORM框架.该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使 ...

  3. 基本 Python 面试问题

    目录 1.为什么学习Python? 2.通过什么途径学习的Python? 3.Python和Java.PHP.C.C#.C++等其他语言的对比? 4.简述解释型和编译型编程语言? 5.Python解释 ...

  4. 10-numpy笔记-np.random.randint

    b_idx = np.random.randint(0, 9, 90) >>> b_idx array([0, 1, 5, 4, 7, 2, 7, 0, 0, 4, 2, 2, 3, ...

  5. 团队冲刺---Five

    今天的计划:做界面. 昨天做了什么? 研究了css代码和模板,进行测试模板. 遇到的困难:使用标签时运用不熟总出错.

  6. xpath获取标签对本身含内容, 获取html内容

    通常使用xpath我们直接定位到标签后, 使用/text() 或 //text()来获取标签对之间的文本值, 但特殊情况下我们也需要获取标签本身含文本值, 操作如下: 文件为html, 标签对结构如下 ...

  7. 基于Django的Rest Framework框架的序列化组件

    本文目录 一 Django自带序列化组件 二 rest-framework序列化之Serializer 三 rest-framework序列化之ModelSerializer 四 生成hypermed ...

  8. apache启动错误 AH00072

    错误描述: make_sock: could not bind to address [::]:443 G:\Apache24\bin>httpd.exe -w -n "Apache2 ...

  9. loonflow 工单系统

    该项目是基于django的工作流引擎,工单.项目托管在 Github 一.安装基础环境 1.1 安装python 和 pip yum install -y epel-release yum insta ...

  10. Clean Code 笔记 之 第二章

    你是否真正的会命名 前言 这是我第二次看这本书了(Clean Code)的时候,第一次看的时候是,看到某世界五百强在他们的代码中我竟然看不到一句注释,现在我还记得当时的情景,当我Download 下第 ...