定义函数的方式有两种, 一种是函数声明,一种就是函数表达式了

函数声明最常见了,

sayHi();

// 函数声明会发生提升

function sayHi () {

  alert('Hi')

}

函数表达式

var functionName = function (arg0, arg1, arg2) {

  // 函数体

};

创建一个函数然后赋值给变量,这种情况下创建的函数叫匿名函数,因为function 关键字后面没有标识符,匿名函数的name是空字符串

函数表达式与其他表达式不一样,使用前必须先赋值,不会发生函数提升

用处:

(1)递归

function factorial (num) {

  if (num <= 1) {

    return 1;

  } else {

    return num*factorial(num-1);

  }

}

这是一个经典的阶乘函数,下面代码会导致函数出错

var anotherFactorial = factorial;

factorial = null;

alert(anotherFactorial(4));  // 出错!

原因,这里把函数赋值给另一个变量(指针),同时将原函数指针赋值为空,但是在调用的时候,仍然会调用到factorial(),但其已经不存在了,就会出错

我们之前是用arguments.callee 解决这个问题,arguments对象的callee指针能指向拥有该arguments对象的函数。

故:

function factorial (num) {

  if (num <= 1) {

    return 1;

  } else {

    return num*arguments.callee(num-1);

  }

}

但是在严格模式下,不能通过脚本访问arguments.callee ,访问这个属性会导致错误,不过我们可以用命名函数表达式达到相同的效果

即:

var factorial = (function func (num) {

  if (num <= 1) {

    return 1;

  } else {

    return num*func(num-1);

  }

});

JS 函数表达式的更多相关文章

  1. js函数表达式和函数声明的区别

    我们已经知道,在任意代码片段外部添加包装函数,可以将内部的变量和函数定义"隐 藏"起来,外部作用域无法访问包装函数内部的任何内容. 例如: var a = 2; function ...

  2. JS函数表达式

    导图

  3. js立即调用的函数表达式

    1.多种实现 // 下面2个括弧()都会立即执行 (function () { /* code */ } ()); // 推荐使用这个 (function () { /* code */ })(); ...

  4. JS中函数声明与函数表达式的不同

    Js中的函数声明是指下面的形式: function functionName(){   } 这样的方式来声明一个函数,而函数表达式则是类似表达式那样来声明一个函数,如 var functionName ...

  5. [JS]深入理解JavaScript系列(4):立即调用的函数表达式

    转自:汤姆大叔的博客 前言 大家学JavaScript的时候,经常遇到自执行匿名函数的代码,今天我们主要就来想想说一下自执行.在详细了解这个之前,我们来谈了解一下"自执行"这个叫法 ...

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

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

  7. js学习之函数表达式及闭包

    来自<javascript高级程序设计 第三版:作者Nicholas C. Zakas>的学习笔记(七) 直接切入主题~ 定义函数的方式有两种: 函数声明 function functio ...

  8. 重操JS旧业第九弹:函数表达式

    函数表达式,什么概念,表达式中的函数表达式. 1 函数申明 function 函数名([函数参数]){ //函数体 } js中无论像这样的显示函数什么放在调用之前还是调用之后,都不影响使用,因为js解 ...

  9. JS立即执行函数表达式(IIFE)

    原文为 http://benalman.com/news/2010/11/immediately-invoked-function-expression/#iife ----------------- ...

随机推荐

  1. 目标检测之选择性搜索-Selective Search

    一.滑动窗口检测器 一种用于目标检测的暴力方法就是从左到右,从上到下滑动窗口,利用分类识别目标.为了在不同观察距离处检测不同的目标类型,我们可以使用不同大小和宽高比的窗口 得到窗口内的图片送入分类器, ...

  2. oracle安装过程中先决条件检查失败的解决办法

    1:公司数据库开始用的mysql,因为公司做的是保密性项目,所以就在项目日志过多的时候项目有爆炸的迹象啊(3000千万数据,貌似mysql有点撑不住).然后组长开始让我安装oracle,公司的内网也是 ...

  3. [转] JavaScript 单例模式

    定义 确保一个类仅有一个实例,并提供一个访问它的全局访问点. 单例模式使用的场景 比如线程池.全局缓存等.我们所熟知的浏览器的window对象就是一个单例,在JavaScript开发中,对于这种只需要 ...

  4. http账户密码的截取

    首先,http的前提也是基于arp欺骗的,当arp欺骗成功后,方可进行. 具体步骤如下: 1.打开终端,先进行流量的转发:echo  1  >/proc/sys/net/ipv4/ip_forw ...

  5. vsftp为不同用户设置不同的ftp的根目录

    需求 要求ftp登录后的根目录是/var/test/,但是又不能影响其他用户的登录路径,因为有些程序是直接在根目录进行操作的,而没有目录切换的过程.操作过程新建用户 useradd test1user ...

  6. HDU4622 Reincarnation 字符串 SAM

    原文链接https://www.cnblogs.com/zhouzhendong/p/HDU4622.html 题目传送门 - HDU4622 题意 多组数据. 对于每一组数据,给定一个字符串 s , ...

  7. netty03(基于4.1.23.Final 版本的案例)

    基于前面的netty01和netty02修改一下版本,可以点进去的 将maven依赖版本改了一下 <!-- netty版本:netty-5.0.0.Alpha2 http://files.cnb ...

  8. Linux安装Tomcat-Nginx-FastDFS-Redis-Solr-集群——【第五集之网络配置】

    还有对第五集的补充:https://www.cnblogs.com/lirenhe/p/10405069.html 1,如果不为这个linux系统或者这台虚拟机配置IP,就不能实现通信.这样的之后安装 ...

  9. 使用json web token

    由来 做了这么长时间的web开发,从JAVA EE中的jsf,spring,hibernate框架,到spring web MVC,到用php框架thinkPHP,到现在的nodejs,我自己的看法是 ...

  10. Jenkins不能及时更新svn到最新代码

    在Jenkins配置项目url项目名后添加@HEAD即可.