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

函数声明最常见了,

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. Just Oj 2017C语言程序设计竞赛高级组A: 求近似值(矩阵快速幂)

    A: 求近似值 时间限制: 1 s      内存限制: 128 MB 提交 我的状态 题目描述 求⌊(5–√+6–√)2n⌋⌊(5+6)2n⌋%9932017. 例如:n=1,(5–√+6–√)2( ...

  2. Docker建立自己的私有仓库

    拉去仓库镜像 docker pull registry:latest 创建存储账户的文件夹路径 mkdir -p /{dir}/auth/ 创建用户密码信息文件 docker run --entryp ...

  3. file /usr/share/mysql/charsets/README from install of MySQL-server-5.1.73-1.glibc23.i386 conflicts with file from package mysql-libs-5.1.73-8.el6_8.i686

    1:也许之前的机器安装过Mysql,但是自己不知道,账号密码也忘记了,又执行安装操作,导致Mysql不兼容问题.Linux上安装MySQL时出现不兼容的解决办法,错误如下所示: [root@maste ...

  4. The authenticity of host 'slaver2 (192.168.199.132)' can't be established. RSA key fingerprint is cc:4e:23:01:ca:97:52:21:85:78:bc:29:ca:b3:12:52.

    1:ssh登录 The authenticity of host 192.168.199.132 can't be established. 的问题 问题出现了,总要解决吧,百度一下,详细介绍的很多, ...

  5. 安装和强行卸载fuse

    先卸载 yum list fuse yum --setopt=tsflags=noscripts remove fuse.x86_64 安装 yum install automake gcc-c++ ...

  6. C++ ifstream ofstream

    原文出自[比特网],转载请保留原文链接:http://soft.chinabyte.com/database/460/11433960.sh [导读] ofstream是从内存到硬盘,ifstream ...

  7. EF批量插入数据(Z.EntityFramework.Extensions)

    EF用原生的插入数据方法DbSet.ADD()和 DbSet.AddRange()都很慢.所以要做大型的批量插入只能另选它法. 1.Nugget 2.代码 using EF6._0Test.EF; u ...

  8. asp.net MVC5为WebAPI添加命名空间的支持

    前言 默认情况下,微软提供的MVC框架模板中,WebAPI路由是不支持Namespace参数的.这导致一些比较大型的项目,无法把WebApi分离到单独的类库中. 本文将提供解决该问题的方案. 微软官方 ...

  9. nginx限制单个IP的最大连接数量限制下载速度

    今天seafile服务因为测试在下载文件的时候,带宽占用过大,导致seafile客户端无法登陆的问题. 我们公司的seafile是通过nginx代理的8000端口,因此我这边通过修改nginx配置来解 ...

  10. 064 SparkStream与kafka的集成,主要是编程

    这里面包含了如何在kafka+sparkStreaming集成后的开发,也包含了一部分的优化. 一:说明 1.官网 指导网址:http://spark.apache.org/docs/1.6.1/st ...