JavaScript引用类型Function实例详解


Posted in Javascript onAugust 09, 2018

本文实例讲述了JavaScript引用类型Function。分享给大家供大家参考,具体如下:

Function类型

函数是对象,函数名是指针:每个函数都是Function类型的实例。由于函数是对象,因此函数名是一个指向函数对象的指针,不会与某个函数绑定,一个函数可能会有多个名字。

function getSum(a, b) {
  return a + b;
}
alert(getSum(2, 3));//5
var copy = getSum;
alert(copy(2, 3));//5
getSum = null;
alert(copy(2, 3));//5

定义函数的方式有三种:函数声明函数表达式Function构造函数

Function构造函数接收任意数量的参数,前面的参数枚举了函数的参数,最后一个参数是函数体。一般不推荐使用Function构造函数定义函数。

var getSum = new Function("a", "b", "return a + b";

JavaScript没有函数重载的概念,若声明了两个同名函数,则后面的函数会覆盖前面的函数。

由于函数名本身是变量,因此函数也可以作为值来使用,不仅可以传递一个函数作为参数,还可以将函数作为返回值。

function callFunction(func, arguments) {
  return func(arguments);
}
function sayHello(name) {
  return "Hello, " + name;
}
var result = callFunction(sayHello, "Alice");
alert(result);//Hello, Alice

①、函数声明

function 函数名称(参数|可选) { 函数体 }

例:

function func1(){// 声明,程序的一部分
  function func() {// 声明,函数体的一部分
    ...//函数体
  }
}

②、函数表达式

function 函数名称|可选(参数|可选) { 函数体 }

例1:

var fun = function func() {};//表达式,赋值表达式的一部分

例2:

new function func(){};//表达式,new表达式

例3:

(function func(){});
//表达式,包含在分组操作符——括号()内,括号()内只能包含表达式

例4:

[function func() {}];//表达式,数组初始化器内只能是表达式

例5:

1, function func() {};//表达式,逗号只能操作表达式

③、函数构造器

函数构造器创建的函数的[[Scope]]属性仅包含全局对象。

<script>
  var a = 1;
  func1();
  function func1() {
    var a = 2;
    var b = 3;
    var func2 = new Function("alert(a); alert(b);");
    func2();//1,b is not defined
  }
</script>

函数构造器创建的函数func2可以从全局对象中取得变量a,但全局对象中没有b,因此报错:b未定义。

函数声明和函数表达式的区别

1)函数声明在进入上下文阶段创建,在代码执行阶段就已经可用了,函数表达式则是在代码执行阶段才创建,所以函数声明可以提升,但函数表达式则不能。

函数声明提升:

func();//Function declaration
function func(){
  alert("Function declaration");
}

函数表达式不能提升:

func();//报错:func is not a function
var func = function (){
  alert("Function expression");
}

2)函数声明影响变量对象VO,也就是存储在上下文的VO中的变量对象,函数表达式不影响变量对象VO,不存在于变量对象中,这意味着既不可能通过名称在函数声明之前调用它,也不可能在声明之后调用它。但是,函数表达式在递归调用中可以通过名称调用自身。

例1:

alert(func); //报错:func is not a function。定义之前不可用,因为它在代码执行阶段创建
(function func() {});
alert(func); //报错:func is not a function。定义之后也不可用,因为它不在变量对象VO中

例2:

(function func(param) {
  if (param) {
    return;
  }
  func(true);//func可用,递归调用可以通过名称调用自身
})();
func(); // func is not a function,外部不可用

3)函数声明只能出现在程序或函数体内,不能出现在表达式或块({ … })中,如if、while或for语句中。因为JavaScript无块级作用域,只有函数和全局作用域。 函数表达式出现在表达式的位置。

函数声明:有的浏览器会返回if,而有的浏览器会返回else。

if (true) {
  function func() {
    alert('if');
  }
}
else {
  function func() {
    alert('else');
  }
}
func();

函数表达式:所有浏览器都返回if。

var func;
if (true) {
  func = function() {
    alert('if');
  };
}
else {
  func = function() {
    alert('else');
  };
}
func();

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
javascript编程起步(第五课)
Jan 10 Javascript
JavaScript DOM学习第八章 表单错误提示
Feb 19 Javascript
JavaScript 变量作用域分析
Jul 04 Javascript
AngularJS入门教程之Hello World!
Dec 06 Javascript
JavaScript实现倒计时代码段Item1(非常实用)
Nov 03 Javascript
第三篇Bootstrap网格基础
Jun 21 Javascript
基于JavaScript实现鼠标箭头移动图片跟着移动
Aug 30 Javascript
用js实现before和after伪类的样式修改的示例代码
Sep 07 Javascript
Vue单页及多页应用全局配置404页面实践记录
May 22 Javascript
antd组件Upload实现自己上传的实现示例
Dec 18 Javascript
微信小程序 wx:for遍历循环使用实例解析
Sep 09 Javascript
jQuery弹框插件使用方法详解
May 26 jQuery
jquery ajax加载数据前台渲染方式 不用for遍历的方法
Aug 09 #jQuery
JavaScript引用类型之基本包装类型实例分析【Boolean、Number和String】
Aug 09 #Javascript
vue修改对象的属性值后页面不重新渲染的实例
Aug 09 #Javascript
vue异步axios获取的数据渲染到页面的方法
Aug 09 #Javascript
vue2.0的虚拟DOM渲染思路分析
Aug 09 #Javascript
Angular动画实现的2种方式以及添加购物车动画实例代码
Aug 09 #Javascript
Vue.js 通过jQuery ajax获取数据实现更新后重新渲染页面的方法
Aug 09 #jQuery
You might like
PHP实现无限级分类(不使用递归)
2015/10/22 PHP
JavaScript 输入框内容格式验证代码
2010/02/11 Javascript
推荐10个超棒的jQuery工具提示插件
2011/10/11 Javascript
javascript跑马灯悬停放大效果实现代码
2012/12/12 Javascript
JQuery 图片的展开和伸缩实例讲解
2013/04/18 Javascript
左侧是表头的JS表格控件(自写,网上没有的)
2013/06/04 Javascript
jQuery实现滑动页面固定顶部显示(可根据显示位置消失与替换)
2015/10/28 Javascript
Google 地图控件集详解及实例代码
2016/08/06 Javascript
Javascript生成带参数的二维码示例
2016/10/10 Javascript
vue多级多选菜单组件开发
2020/09/08 Javascript
本地存储localStorage用法详解
2017/07/31 Javascript
微信小程序框架wepy之动态控制类名
2018/09/14 Javascript
手把手教你如何使用nodejs编写cli命令行
2018/11/05 NodeJs
实例介绍JavaScript中多种组合继承
2019/01/20 Javascript
关于layui的动态图标不显示的解决方法
2019/09/04 Javascript
可拖拽组件slider.js使用方法详解
2020/12/04 Javascript
[57:09]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第一场 1月26日
2021/03/11 DOTA
python使用chardet判断字符串编码的方法
2015/03/13 Python
Python判断文本中消息重复次数的方法
2016/04/27 Python
Python中正则表达式详解
2017/05/17 Python
使用pycharm设置控制台不换行的操作方法
2019/01/19 Python
Python实现的爬取豆瓣电影信息功能案例
2019/09/15 Python
浅谈Python线程的同步互斥与死锁
2020/03/22 Python
Python如何实现爬取B站视频
2020/05/20 Python
python自动提取文本中的时间(包含中文日期)
2020/08/31 Python
Charlotte Tilbury英国官网:英国彩妆品牌
2017/05/26 全球购物
法国亚马逊官方网站:Amazon.fr
2020/12/19 全球购物
自主招生自荐信
2013/12/08 职场文书
剪枝的学问教学反思
2014/02/07 职场文书
公司周年庆典策划方案
2014/05/17 职场文书
道德模范事迹材料
2014/12/20 职场文书
会计求职自荐信范文
2015/03/04 职场文书
2015年高考寄语或鼓励的话
2015/03/23 职场文书
新学期新寄语,献给新生们!
2019/11/15 职场文书
用 Python 定义 Schema 并生成 Parquet 文件详情
2021/09/25 Python
B站评分公认最好看的动漫,你的名字评分9.9,第六备受喜欢
2022/03/18 日漫