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 tools 系列 scrollable(2)
Sep 06 Javascript
JavaScript 小型打飞机游戏实现原理说明
Oct 28 Javascript
JQuery each打印JS对象的方法
Nov 13 Javascript
原生js实现移动开发轮播图、相册滑动特效
Apr 17 Javascript
js实现下拉列表选中某个值的方法(3种方法)
Dec 17 Javascript
Bootstarp风格的toggle效果分享
Feb 23 Javascript
浅述节点的创建及常见功能的实现
Dec 15 Javascript
Vue中如何实现轮播图的示例代码
Jul 27 Javascript
Vue props 单向数据流的实现
Nov 06 Javascript
详解React中合并单元格的正确写法
Jan 08 Javascript
小程序实现左滑删除的效果的实例代码
Oct 19 Javascript
微信小程序picker组件两列关联使用方式
Oct 27 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 escape URL编码
2008/12/10 PHP
PHP Error与Logging函数的深入理解
2013/06/03 PHP
php制作unicode解码工具(unicode编码转换器)代码分享
2013/12/24 PHP
PHP根据IP判断地区名信息的示例代码
2014/03/03 PHP
php session的锁和并发
2016/01/22 PHP
PHP将字符串首字母大小写转换的实例
2017/01/21 PHP
经典的解除许多网站无法复制文字的绝招
2006/12/31 Javascript
JavaScript实现网页上的浮动广告的简单方法
2013/06/14 Javascript
java、javascript实现附件下载示例
2014/08/14 Javascript
jquery操作对象数组元素方法详解
2014/11/26 Javascript
基于jquery实现的自动补全功能
2015/03/12 Javascript
在JavaScript的AngularJS库中进行单元测试的方法
2015/06/23 Javascript
Web程序员必备的7个JavaScript函数
2016/06/14 Javascript
Bootstrap select多选下拉框实现代码
2016/12/23 Javascript
微信小程序上传图片到服务器实例代码
2017/11/07 Javascript
让网站自动生成章节目录索引的多个js代码
2018/01/07 Javascript
详解如何在React组件“外”使用父组件的Props
2018/01/12 Javascript
vue2.0.js的多级联动选择器实现方法
2018/02/09 Javascript
小程序scroll-view组件实现滚动的示例代码
2018/09/20 Javascript
Nodejs把接收图片base64格式保存为文件存储到服务器上
2018/09/26 NodeJs
JS前端知识点offset,scroll,client,冒泡,事件对象的应用整理总结
2019/06/27 Javascript
vue v-for直接循环数字实例
2019/11/07 Javascript
小程序组件传值和引入sass的方法(使用vant Weapp组件库)
2020/11/24 Javascript
three.js如何实现3D动态文字效果
2021/03/03 Javascript
Python叠加两幅栅格图像的实现方法
2019/07/05 Python
如何解决django-celery启动后迅速关闭
2019/10/16 Python
keras训练浅层卷积网络并保存和加载模型实例
2020/07/02 Python
python pandas dataframe 去重函数的具体使用
2020/07/20 Python
为什么使用接口?
2014/08/13 面试题
公积金单位接收函
2014/01/11 职场文书
简历上的自我评价
2014/02/03 职场文书
小组合作学习反思
2014/02/18 职场文书
活动策划求职信模板
2014/04/21 职场文书
公司委托书格式范文
2014/10/09 职场文书
Appium中scroll和drag_and_drop根据元素位置滑动
2022/02/15 Python
教你在 Java 中实现 Dijkstra 最短路算法的方法
2022/04/08 Java/Android