函数声明与表达式的区别

HTML5学堂:函数有不同的定义方法,一种是函数声明,另一种是函数表达式,那么这两种有何区别呢?

函数声明的基本语法

function functionName(arg0, arg1, ..., argn) {
    // 函数体 - HTML5学堂
}

函数声明的重要特征:函数声明提升

在执行代码之前,会先读取函数声明,这也就意味着,可以把函数声明放在调用它的语句的后面。

函数表达式的常见语法形式

var functionName = function(arg0, arg1, ..., argn) {
    // 函数体 - HTML5学堂
};

如何理解上面这段代码呢?创建一个匿名函数(也叫拉达姆函数),并将整个函数赋值给变量functionName

在执行这句代码之前,是不能够实现functionName()函数的调用的,函数表达式和其他表达式一样,都需要在使用前赋值。

经典案例

此段代码合法

var say;
if(conditions) {
    say = function () { console.log('函数表达式-代码合法'); }
} else {
    say = function () { console.log('H5course'); }
}

此段代码不合法

if(conditions) {
    function say() { console.log('函数声明-不合法代码'); }
} else {
    function say() { console.log('HTML5学堂'); }
}

拓展性知识

在使用函数声明创建函数时,对于非IE浏览器,会为函数定义一个非标准的name属性,可以通过name属性访问到给函数指定的名字。而采用函数表达式所定义的函数,name属性为空字符串。如下:

function h5course() {};
console.log(h5course.name);
var h5 = function(){};
console.log(h5.name);

此段代码中,前者会打印h5course,但是后者只会输出空字符串

写在最后的一些话:关于此方面知识的理解,会涉及到“预编译与执行”,想了解此方面知识的童鞋可以查看——>《JavaScript 运行机制之执行顺序详解》

HTML5学堂小编-利利。耗时:1.5h

原文发布于微信公众号 - HTML5学堂(h5course-com)

原文发表时间:2016-03-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏C/C++基础

C++不要在构造函数和析构函数中调用虚函数

虽然可以对虚函数进行实调用,但程序员编写虚函数的本意应该是实现动态联编。在构造函数中调用虚函数,函数的入口地址是在编译时静态确定的,并未实现虚调用。但是为什么在...

822
来自专栏Golang语言社区

golang的内存模型与new()与make()

要彻底理解new()与make()的区别, 最好从内存模型入手. golang属于c family, 而c程序在unix的内在模型: |低地址|text|dat...

6.4K7
来自专栏HTML5学堂

获取对象具体类型的功能函数

HTML5学堂:JavaScript当中,时常会使用到typeof来进行数据类型的检测,但是我们觉得typeof不能够满足我们的需求,对于数组、函数、时间对象等...

3087
来自专栏数据结构与算法

27:除以13

27:除以13 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB描述 输入一个大于0的大整数N,长度不超过100位,要求输出其除...

2729
来自专栏C/C++基础

C/C++数据类型的转换之终极无惑

数据类型在编程中经常遇到,虽然可能存在风险,但我们却乐此不疲的进行数据类型的转换。

913
来自专栏Golang语言社区

golang的内存模型与new()与make()

要彻底理解new()与make()的区别, 最好从内存模型入手. golang属于c family, 而c程序在unix的内在模型: |低地址|text|dat...

3325
来自专栏西枫里博客

Python学习笔记七(序列操作)

本次学习内容是首先是回顾下昨天的format格式化函数。接着上一次格式化字符串操作的后续课程,序列的操作。什么是序列?序列是有列表、元组、字符串构成,它们之间有...

802
来自专栏JetpropelledSnake

Python入门之@classmethod与@staticmethod

本章内容:     1. @classmethond     2. @staticmethod ================================...

3686
来自专栏Modeng的专栏

Javascript数组系列五之增删改和强大的 splice()

今天是我们介绍数组系列文章的第五篇,也是我们数组系列的最后一篇文章,只是数据系列的结束,所以大家不用担心,我们会持续的更新干货文章。

572
来自专栏Golang语言社区

golang的内存模型与new()与make()

要彻底理解new()与make()的区别, 最好从内存模型入手. golang属于c family, 而c程序在unix的内在模型: |低地址|text|dat...

2836

扫码关注云+社区