javascript 函数表达和闭包
函数表达式和闭包
针对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 函数表达和闭包的更多相关文章
- 深入理解javascript函数参数与闭包(一)
在看此文章,希望先阅读关于函数基础内容 函数定义与函数作用域 的章节,因为这篇文章或多或少会涉及函数基础的内容,而基础内容,我放在函数定义函数作用域 章节. 本文直接赘述函数参数与闭包,若涉及相关知识 ...
- JavaScript函数表达式、闭包、模仿块级作用域、私有变量
函数表达式是一种非常有用的技术,使用函数表达式可以无需对函数命名,从而实现动态编程.匿名函数,是一种强大的方式,一下总结了函数表达式的特点: 1.函数表达式不同于函数声明,函数声明要求有名字,但函数表 ...
- JavaScript 函数作用域和闭包
函数作用域和闭包 词法作用域 它们在定义它们的作用域里运行,而不是在执行的作用域运行,但是只有在运行时,作用域链中的属性才被 定义(调用对象),此时,可访问任何当前的绑定. 调用对象 ...
- 剖析JavaScript函数作用域与闭包
在我们写代码写到一定阶段的时候,就会想深究一下js,javascript是一种弱类型的编程语言,而js中一个最为重要的概念就是执行环境,或者说作用域.作用域重要性体现在哪呢?首先,函数在执行时会创建作 ...
- Javascript ----函数表达和形参实参
1.函数是对象,函数名实际上是函数对象的指针 1.函数声明方式 (函数声明提前) function sum(num1,num2){return num1+num2;} 2.函数表达式 var sums ...
- 第八章:Javascript函数
函数是这样一段代码,它只定义一次,但可能被执行或调用任意次.你可能从诸如子例程(subroutine)或者过程(procedure)这些名字里对函数概念有所了解. javascript函数是参数化的: ...
- JavaScript学习总结(二)——闭包、IIFE、apply、函数与对象
一.闭包(Closure) 1.1.闭包相关的问题 请在页面中放10个div,每个div中放入字母a-j,当点击每一个div时显示索引号,如第1个div显示0,第10个显示9:方法:找到所有的div, ...
- JavaScript学习总结(三)——闭包、IIFE、原型、函数与对象
一.闭包(Closure) 1.1.闭包相关的问题 请在页面中放10个div,每个div中放入字母a-j,当点击每一个div时显示索引号,如第1个div显示0,第10个显示9:方法:找到所有的div, ...
- javaScript函数与闭包
js中函数也是对象,具有一切对象的特征,可以作为表达式给变量赋值,可以作为函数的形参,或者函数的返回值,函数内可以嵌套函数等等,函数内以声明方式定义的函数是局部函数,用表达式声明的函数则由赋值变量的性 ...
随机推荐
- Ubuntu下搭建Kubernetes集群(2)--docker基本操作
查看当前的容器和images docker ps -a docker images 1.创建新的容器 docker run -it --name 容器名 镜像名 /bin/bash # 挂载目录和端口 ...
- Linux(CentOS)上,安装了Apache(httpd)后,其他的电脑无法访问的原因
今天试了下在虚拟机上利用CentOS系统的yum命令安装好了httpd(apache2.2),然后在windows系统下访问此虚拟机的ip地址,却访问不了. 因为前段时间有知道过iptable的限制, ...
- 卷积,reLu,池化的意义
1.卷积 提取局部特征 2.Relu 留下相关特征,去掉不相关特征,卷积之后的正值越大,说明与卷积核相关性越强,负值越大,不相关性越大. 3.池化 池化的目的: (1)留下最相关的特征,或者说留下最明 ...
- 基于Distiller的模型压缩工具简介
Reference: https://github.com/NervanaSystems/distiller https://nervanasystems.github.io/distiller/in ...
- 【电脑】XSHELL破解
序列号
- NOIP201110观光公交
题目描述 Description 风景迷人的小城Y市,拥有n个美丽的景点.由于慕名而来的游客越来越多,Y市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第0分钟出现在1号景点,随后 ...
- 关于==和equals的区别和联系,面试这么回答就可以
长篇大论的话,我这里就不多写了,相信大家入门java 的时候就知道个大概了,这里想表述的是,如果面试官问你<关于==和equals的区别>,该怎么回答完美呢?可以这样说 总结的来说: 1) ...
- [Algorithm] 617. Merge Two Binary Trees
Given two binary trees and imagine that when you put one of them to cover the other, some nodes of t ...
- <Math> 165 8
165. Compare Version Numbers class Solution { public int compareVersion(String version1, String vers ...
- alarm()函数的使用总结
alarm()函数说明 1.引用头文件:#include <unistd.h>; 2.函数标准式:unsigned int alarm(unsigned int seconds); 3.功 ...