Javascript学习笔记之 函数篇(一) : 函数声明和函数表达式


Posted in Javascript onJune 24, 2014

函数声明

function foo() {}

函数 foo 将会在整个程序执行前被 hoist (提升),因此它在定义 foo 函数的整个 scope (作用域)中都是可用的。即使在函数定义之前调用它也没问题。

foo(); // Works because foo was created before this code runs
function foo() {}

因为我打算专门写篇介绍作用域的文章,所以这里就不详述了。

函数表达式

对于函数声明,函数的名称是必须的,而对于函数表达式而言则是可选的,因此,就出现了匿名函数表达式和命名函数表达式。如下:

函数声明: function functionName (){  }
函数声明: function functionName[可选](){  }
那么我就知道,如果没有函数名的话,一定就是函数表达式,但是对于有函数名的情况该如何判断呢?
Javascript 规定如果整个函数体是作为表达式的一部分时,那么它就是函数表达式,否则即是函数声明。以下为表达式:

var fuc = foo(){}

我们再举几个极端的表达式例子:

!function foo(){}
true && function foo(){}

以上的语句这里只是为了区分函数表达式,一般不会这样写。那么用一个对比的例子来看看效果:

foo1();//foo1 is not defined 
foo2();//works because foo2 was created before this code runs
!function foo1() {
  alert('foo1 works');
};
function foo2() {
  alert('foo2 works');
};

匿名函数表达式

var foo = function() {};

上面的例子将一个匿名函数赋值给了变量 foo。

foo; // 'undefined'
foo(); // this raises a TypeError
var foo = function() {};

由于 var 是一个声明所以这里对变量 foo 进行 hoist (提升),因此当程序执行时,变量 foo 是可调用的。
但是由于赋值语句只有在运行时才生效,所以变量 foo 的值为 undefined。

命名函数表达式

另一个要讲到的就是命名函数的赋值。

var foo = function bar() {
  bar(); // Works
};
bar(); // ReferenceError

在这里,命名函数 bar 赋值给了变量 foo,所以在函数声明外是不可见的,但在 bar 函数内部仍然可以调用。这是因为 Javascript 对命名函数处理的机制,函数的名称永远在函数内部的作用域中有效。

Javascript 相关文章推荐
Jquery Ajax学习实例3 向WebService发出请求,调用方法返回数据
Mar 16 Javascript
jquery实现商品拖动选择效果代码(自写)
May 28 Javascript
js螺旋动画效果的具体实例
Nov 15 Javascript
Dojo Javascript 编程规范 规范自己的JavaScript书写
Oct 26 Javascript
javascript实现日期格式转换
Dec 16 Javascript
jQuery左侧大图右侧小图焦点图幻灯切换代码分享
Aug 19 Javascript
jquery.cookie.js实现用户登录保存密码功能的方法
Apr 15 Javascript
老生常谈javascript变量的命名规范和注释
Sep 29 Javascript
for循环 + setTimeout 结合一些示例(前端面试题)
Aug 30 Javascript
Nginx设置为Node.js的前端服务器方法总结
Mar 27 Javascript
ES6实现图片切换特效代码
Jan 14 Javascript
基于openlayers实现角度测量功能
Sep 28 Javascript
Javascript学习笔记之 对象篇(四) : for in 循环
Jun 24 #Javascript
Javascript学习笔记之 对象篇(三) : hasOwnProperty
Jun 24 #Javascript
js实现div闪烁原理及实现代码
Jun 24 #Javascript
Javascript 学习笔记之 对象篇(二) : 原型对象
Jun 24 #Javascript
Javascript学习笔记之 对象篇(一) : 对象的使用和属性
Jun 24 #Javascript
jQuery学习笔记之 Ajax操作篇(三) - 过程处理
Jun 23 #Javascript
jquery 为a标签绑定click事件示例代码
Jun 23 #Javascript
You might like
php实现mysql同步的实现方法
2009/10/21 PHP
php获取本地图片文件并生成xml文件输出具体思路
2013/04/27 PHP
PHP学习笔记(二) 了解PHP的基本语法以及目录结构
2014/08/04 PHP
PHP利用Mysql锁解决高并发的方法
2018/09/04 PHP
extjs 学习笔记(三) 最基本的grid
2009/10/15 Javascript
javascript中比较字符串是否相等的方法
2013/07/23 Javascript
jQuery实现提交按钮点击后变成正在处理字样并禁止点击的方法
2015/03/24 Javascript
jquery实现从数组移除指定的值
2015/06/24 Javascript
json的使用小结
2016/06/08 Javascript
javascript实现图片左右滚动效果【可自动滚动,有左右按钮】
2016/09/19 Javascript
JavaScript Date对象应用实例分享
2017/10/30 Javascript
jQuery中ajax获取数据赋值给页面的实例
2017/12/31 jQuery
jQuery控制input只能输入数字和两位小数的方法
2019/05/16 jQuery
layui 上传文件_批量导入数据UI的方法
2019/09/23 Javascript
electron 安装,调试,打包的具体使用
2019/11/06 Javascript
[00:36]DOTA2上海特级锦标赛 Archon战队宣传片
2016/03/04 DOTA
Python编程实现输入某年某月某日计算出这一天是该年第几天的方法
2017/04/18 Python
NumPy.npy与pandas DataFrame的实例讲解
2018/07/09 Python
Python+Pandas 获取数据库并加入DataFrame的实例
2018/07/25 Python
关于python列表增加元素的三种操作方法
2018/08/22 Python
Python基础学习之类与实例基本用法与注意事项详解
2019/06/17 Python
python3.6+django2.0+mysql搭建网站过程详解
2019/07/24 Python
Python2 与Python3的版本区别实例分析
2020/03/30 Python
django 实现后台从富文本提取纯文本
2020/07/02 Python
pycharm配置python 设置pip安装源为豆瓣源
2021/02/05 Python
瑞典多品牌连锁店:Johnells
2021/01/13 全球购物
Android interview questions
2016/12/25 面试题
傲盾软件面试题
2015/08/17 面试题
Why do we need Unit test
2013/01/03 面试题
平面设计师的工作职责
2013/11/21 职场文书
初中同学聚会感言
2014/02/11 职场文书
销售口号大全
2014/06/11 职场文书
启动仪式策划方案
2014/06/14 职场文书
2015年教导处教学工作总结
2015/07/22 职场文书
2019教师的学习计划
2019/06/25 职场文书
一文解答什么是MySQL的回表
2022/08/05 MySQL