我们都知道定义函数的方式有两种,一种是函数声明,另外一种就是函数表达式。

函数声明

语法为: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的函数表达式及其应用的更多相关文章

  1. JavaScript Function(函数表达式)

    创建函数 创建函数的方式有两种:1.函数声明,2.函数表达式 函数声明的语法为 functionName(); //不会报错,函数声明提升function functionName(arg0,arg1 ...

  2. 【JavaScript】函数表达式

    一.前言        接着上一篇的内容,继续学习JavaScript. 二.内容       函数的声明 function functionName(arg0,arg1,arg2){ //函数体 } ...

  3. 浅谈JavaScript的函数表达式(闭包)

    前文已经简单的介绍了函数的闭包.函数的闭包就是有权访问另一个函数作用域的函数,也就是函数内部又定义了一个函数. var Super=function(num){ var count=num; retu ...

  4. JavaScript高级 函数表达式 《JavaScript高级程序设计(第三版)》

    函数表达式的特征 使用函数实现递归 使用闭包定义私有变量 前面我们说到定义函数有两种方式:函数声明.函数表达式. 两者的区别在于函数声明提升,前者在执行之前的上下文环境中直接被赋值,而后者不会. 一. ...

  5. 谈谈javascript的函数作用域

    在一些类似c语言的编程语言中,花括号内的每一段代码都具有各自的作用域,而且变量在声明他们的代码段之外是不可见的,我们称为块级作用域(block scope),而javascript中没有块级作用域.取 ...

  6. 浅谈JavaScript的函数表达式(递归)

    递归函数,在前面的博客中已经简单的介绍了.递归函数是一个通过函数名称在函数内部调用自身的函数.如下: function fac(num){ if(num<1){ return 1; } else ...

  7. javascript中函数表达式的问题讨论

    #函数表达式 ##函数声明和函数表达式的区别 函数的定义有两种形式,一种是函数声明,一种是函数表达式 使用声明时,要注意函数声明提升现象,比如说在if语句中使用声明会出错,但是表达式就不存在这个问题 ...

  8. JavaScript 函数表达式

    JavaScript中创建函数主要有两种方法:函数声明和函数表达式.这两种方式都有不同的适用场景.这篇笔记主要关注的是函数表达式的几大特点以及它的使用场景,下面一一描述. 主要特点 可选的函数名称 函 ...

  9. js学习之函数声明与函数表达式区别[原创]

    作为一名js初学者,与大家分享下.Javascript中有函数声明提升的功能,会优先编译函数声明部分.比如, ff(); function ff(){ alert("hello world. ...

随机推荐

  1. iOS多线程及其感悟

    感觉每天都是匆匆忙忙的,每天似乎都是时间不够用一样,可是等真的想要动手敲代码的时候才发现,原来还有好多好多的知识点不是太熟练,所以,人不可以一直感觉自我良好, 有时间就是那种自我感觉良好的心态毁了自己 ...

  2. xtrabackup备份恢复测试

    http://blog.chinaunix.net/uid-20682026-id-3319204.html

  3. git学习笔记(五)

    ---恢复内容开始--- 嗯 今天又看到一个非常不错的入门git教程 Mark一下 阮一峰Git操作详解 主要讲解了五个常用的git命令 git clone git remote git fetch ...

  4. MySql命令——游标

    1.游标的概念 有时,需要在检索出来的行中前进或后退一行或多行.这就是使用游标的原因.游标(cursor)是一个存储在 MySql 服务器上的数据库查询,它不是一条 select 语句,而是被该语句检 ...

  5. C#使用seleium实现一个自动登录器

    1.http://docs.seleniumhq.org/ 下载seleium包 2.新建一个C#项目,比如控制台,引用seleium包中的dll using System; using System ...

  6. Ubuntu自定义命令

    回到主文件夹 $ cd ~ 建立.bash_aliases $ touch .bash_aliases $ vim .bash_aliases 在此文件中加入一句话: alias cdlauncher ...

  7. MJExtension(JSON到数据模型的自动转换)

    整理自:http://www.jianshu.com/p/93c242452b9b. 1.MJExtension的功能 字典-->模型 模型-->字典 字典数组-->模型数组 模型数 ...

  8. NSNotification消息

    注册消息 [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(方法) name:@"消息名字&q ...

  9. hitTest:withEvent:方法(此方法可实现点击穿透、点击下层视图功能)

    此方法可实现点击穿透.点击下层视图功能 一. hitTest:withEvent:调用过程 iOS系统检测到手指触摸(Touch)操作时会将其放入当前活动Application的事件队列,UIAppl ...

  10. c++ 指针的简单用法

    对于指针,其实只需要明白几点就可以. 1.指针,是一个数值为地址的变量,这里尤其注意,指针变量的值是地址!就是例如40002这种像门牌号的地址值,其实就是内存中的一个编号. 2.&,该符号的意 ...