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 相关文章推荐
关于__defineGetter__ 和__defineSetter__的说明
May 12 Javascript
基于jQuery的动态表格插件
Mar 28 Javascript
JS创建类和对象的两种不同方式
Aug 08 Javascript
JS模拟简易滚动条效果代码(附demo源码)
Apr 05 Javascript
JavaScript每天必学之数组和对象部分
Sep 17 Javascript
JavaScript实现的微信二维码图片生成器的示例
Oct 26 Javascript
JavaScript之map reduce_动力节点Java学院整理
Jun 29 Javascript
react router 4.0以上的路由应用详解
Sep 21 Javascript
浅谈实现vue2.0响应式的基本思路
Feb 13 Javascript
JavaScript数据结构与算法之检索算法示例【二分查找法、计算重复次数】
Feb 22 Javascript
Bootstrap实现模态框效果
Sep 30 Javascript
微信小程序视频弹幕发送功能的实现
Dec 28 Javascript
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替换超长文本中的特殊字符的函数代码
2012/05/22 PHP
解析mysql中UNIX_TIMESTAMP()函数与php中time()函数的区别
2013/06/24 PHP
PHP利用APC模块实现大文件上传进度条的方法
2015/10/29 PHP
php使用正则表达式获取字符串中的URL
2016/12/29 PHP
Javascript模板技术
2007/04/27 Javascript
jQuery Select(单选) 模拟插件 V1.3.62 改进版
2010/07/17 Javascript
精通Javascript系列之数值计算
2011/06/07 Javascript
ASP.NET jQuery 实例10 动态修改hyperlink的URL值
2012/02/03 Javascript
可自己添加html的伪弹出框实现代码
2013/09/08 Javascript
使用jQuery获得内容以及内容的属性
2015/02/26 Javascript
JavaScript中setFullYear()方法的使用详解
2015/06/11 Javascript
javascript实现树形菜单的方法
2015/07/17 Javascript
JavaScript实现大图轮播效果
2017/01/11 Javascript
设置cookie指定时间失效(实例代码)
2017/05/28 Javascript
JS实现手写parseInt的方法示例
2017/09/24 Javascript
快速搭建React的环境步骤详解
2017/11/06 Javascript
使用Vuex实现一个笔记应用的方法
2018/03/13 Javascript
Vue.js实现表格渲染的方法
2018/09/07 Javascript
Vuejs+vue-router打包+Nginx配置的实例
2018/09/20 Javascript
Python多线程threading模块用法实例分析
2019/05/22 Python
Python的几种主动结束程序方式
2019/11/22 Python
tensorflow实现对张量数据的切片操作方式
2020/01/19 Python
浅析python标准库中的glob
2020/03/13 Python
Python如何在windows环境安装pip及rarfile
2020/06/15 Python
python 合并多个excel中同名的sheet
2021/01/22 Python
为您搜罗全球潮流時尚品牌:HBX
2019/12/04 全球购物
基于Python 函数和方法的区别说明
2021/03/24 Python
中专毕业生的自我鉴定
2013/12/01 职场文书
新学期校长寄语
2014/01/18 职场文书
学生抄袭作业的检讨书
2014/10/02 职场文书
辞职信怎么写
2015/02/27 职场文书
辛德勒的名单观后感
2015/06/03 职场文书
在职证明格式样本
2015/06/15 职场文书
高中信息技术教学反思
2016/02/16 职场文书
MySQL为id选择合适的数据类型
2021/06/07 MySQL
如何正确理解python装饰器
2021/06/15 Python