谈谈javascript的函数表达式及其应用
我们都知道定义函数的方式有两种,一种是函数声明,另外一种就是函数表达式。
函数声明
语法为:function关键字后跟函数名。例如:
function functionName(arg0) {
//函数体
}
alert(functionName.name) // "functionName"
函数声明最主要的特征就是函数声明的提升,所以我们可以把函数声明放在调用它的语句的后面,因为执行代码前会先读取函数声明。比如:
hello();
function hello(){
alert("hello");
}
上面的代码可以在浏览器正常运行。
函数表达式
语法如下:
var functionName = function(arg0){
//函数体
};
alert(functionName.name) // ""
如上所示当我们输出函数名时返回了空字符串,因为function关键字后面没有标识符,这种情况下创建的函数为匿名函数。接下来我们就谈谈利用函数表达式所创建的匿名函数有什么应用。
应用
函数表达式最典型的应用就是模仿块级作用域,我们都知道JavaScript没有块级作用域,不过我们可以用函数表达式模仿块级作用域。形成独立作用域,从而避免全局污染。
操作方法:声明匿名函数,立马调用。
最经典的例子:
function createFunctions(){
var result = [];
for (var i=0; i < 10; i++){
result[i] = function(){
return i;
};
}
return result;
}
createFunctions();
乍一看每个函数都应该返回自己的索引值,即位置0的函数返回0,1的返回1,以此类推。实际上每个函数都将返回10,因为这里的i是贯穿整个作用域的,我们把上面代码修改一下:
//写法1
(function(){
//这里是块级作用域
var result = [];
for(var i=0;i<10;i++){
result[i] = (function(num){
return function(){
return num;
};
}(i))();
}
return result;
})(); //[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
//写法2
var hasfunction = function(){
var result = [];
for(var i=0;i<10;i++){
result[i] = (function(num){
return function(){
return num;
};
}(i))();
}
return result;
}
hasfunction();
在立即执行函数执行的时候,i的值被赋值给num,同时创建返回num的闭包,从而result数组每个函数都有一个num变量的副本。
完。
谈谈javascript的函数表达式及其应用的更多相关文章
- JavaScript Function(函数表达式)
创建函数 创建函数的方式有两种:1.函数声明,2.函数表达式 函数声明的语法为 functionName(); //不会报错,函数声明提升function functionName(arg0,arg1 ...
- 【JavaScript】函数表达式
一.前言 接着上一篇的内容,继续学习JavaScript. 二.内容 函数的声明 function functionName(arg0,arg1,arg2){ //函数体 } ...
- 浅谈JavaScript的函数表达式(闭包)
前文已经简单的介绍了函数的闭包.函数的闭包就是有权访问另一个函数作用域的函数,也就是函数内部又定义了一个函数. var Super=function(num){ var count=num; retu ...
- JavaScript高级 函数表达式 《JavaScript高级程序设计(第三版)》
函数表达式的特征 使用函数实现递归 使用闭包定义私有变量 前面我们说到定义函数有两种方式:函数声明.函数表达式. 两者的区别在于函数声明提升,前者在执行之前的上下文环境中直接被赋值,而后者不会. 一. ...
- 谈谈javascript的函数作用域
在一些类似c语言的编程语言中,花括号内的每一段代码都具有各自的作用域,而且变量在声明他们的代码段之外是不可见的,我们称为块级作用域(block scope),而javascript中没有块级作用域.取 ...
- 浅谈JavaScript的函数表达式(递归)
递归函数,在前面的博客中已经简单的介绍了.递归函数是一个通过函数名称在函数内部调用自身的函数.如下: function fac(num){ if(num<1){ return 1; } else ...
- javascript中函数表达式的问题讨论
#函数表达式 ##函数声明和函数表达式的区别 函数的定义有两种形式,一种是函数声明,一种是函数表达式 使用声明时,要注意函数声明提升现象,比如说在if语句中使用声明会出错,但是表达式就不存在这个问题 ...
- JavaScript 函数表达式
JavaScript中创建函数主要有两种方法:函数声明和函数表达式.这两种方式都有不同的适用场景.这篇笔记主要关注的是函数表达式的几大特点以及它的使用场景,下面一一描述. 主要特点 可选的函数名称 函 ...
- js学习之函数声明与函数表达式区别[原创]
作为一名js初学者,与大家分享下.Javascript中有函数声明提升的功能,会优先编译函数声明部分.比如, ff(); function ff(){ alert("hello world. ...
随机推荐
- JS中面向对象的,对象理解、构造函数、原型、原型链
6.1 理解对象 6.1.1 对象属性类型 ECMS属性有两种类型:数据属性和访问器属性 1 数据属性 [[configurable]] 表示能否通过Delete 删除属性从而从新定义属性,能否修改属 ...
- jquery滚动到指定元素,模仿锚点
html <div class="pd-nav"> <div class="n-item active"> 保险服务 <i> ...
- Entity Framework中datetime2 to datetime转换错误
datetime2 to datetime 报错. 因为EF中,DATETIME类型默认是datetime2,数据库默认是datetime. 解决方案: 1.改数据库字段类型为datetime2 2. ...
- SQL SERVER 自定义函数 split
Create function [dbo].[split] ( ), ) ) )) as begin declare @i int set @SourceSql=rtrim(ltrim(@Source ...
- C# Winform WindowsMediaPlayer控件
要做一个视频无缝切换的程序,所谓无缝就是在一个视频结束时立即开始另一个视频,中间不要有切换的黑屏 实现思路是放两个wmp播放控件,其中每个时刻只有一个在播放,另外一个处于暂停状态,并隐藏 当一个视频播 ...
- Eclipse闪退解决办法
解决方式: 1.通过在命令行中输入“where java”,找到除jdk目录下的所有java相关程序,直接删掉(一般会在C:\WINDOWS\system32下) 2.内存不足,打开Eclipse目录 ...
- HibernateTemplate类的方法flush()
hibernate的实体都是存储在缓存中的,所以你会发现有的时候当你创建出两个主键相通的实体的时候会报错.正常情况是当你调用save方法的时候,这个实体对象未必已经保存到数据库了,调用close方法的 ...
- Windows7上FTP服务器建立
1. FTP服务器建立 注意:千万不能使用FTP和ftp建立用户,否则无法登陆ftp服务器. 1.1本地机器上创建一个用户 这个用户是用来登录到FTP的.我的电脑右键->管理->本地用户和 ...
- linux软件安装(rpm,源码编译)
1.rpm(redhat package manager)管理器主要目的在于解决软件的安装.卸载.升级.查询.验证等,例如升级过程中,保留软件的配置文件,安装过程中,检查软件依赖的库文件,以及卸载过程 ...
- DLL技术应用04 - 零基础入门学习Delphi47
DLL技术应用04 让编程改变世界 Change the world by program 利用DLL实现窗体重用 利用 Delphi 的 DLL 功能,不但能够实现过程和函数重用,而且还可以实现窗体 ...