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 相关文章推荐
jquery关于页面焦点的定位(文本框获取焦点时改变样式 )
Sep 10 Javascript
js使用心得分享
Jan 13 Javascript
JS+CSS实现的拖动分页效果实例
May 11 Javascript
Javascript中Array用法实例分析
Jun 13 Javascript
js实现简单计算器
Nov 22 Javascript
一起学写js Calender日历控件
Apr 14 Javascript
JS如何设置cookie有效期为当天24点并弹出欢迎登陆界面
Aug 04 Javascript
SelectPage v2.4 发布新增纯下拉列表和关闭分页功能
Sep 07 Javascript
在小程序中使用腾讯视频插件播放教程视频的方法
Jul 10 Javascript
ES6使用export和import实现模块化的方法
Sep 10 Javascript
webstorm+vue初始化项目的方法
Oct 18 Javascript
JavaScript DOM常用操作代码汇总
Jul 03 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+mysql实现无限级分类 | 树型显示分类关系
2006/11/19 PHP
php中jQuery插件autocomplate的简单使用笔记
2012/06/14 PHP
php判断用户是否手机访问代码
2015/06/08 PHP
Laravel 5.4.36中session没有保存成功问题的解决
2018/02/19 PHP
PHP-FPM和Nginx的通信机制详解
2019/02/01 PHP
ThinkPHP框架整合微信支付之JSAPI模式图文详解
2019/04/09 PHP
PHP $O00OO0=urldecode &amp; eval 解密,记一次商业源码的去后门
2020/09/13 PHP
(JS实现)MapBar中坐标的加密和解密的脚本
2007/05/16 Javascript
用JavaScript仿PS里的羽化效果代码
2011/12/20 Javascript
EditPlus注册码生成器(js代码实现)
2013/03/25 Javascript
jquery实现简单的拖拽效果实例兼容所有主流浏览器
2013/06/21 Javascript
JavaScript中switch判断容易犯错的一个细节
2014/08/27 Javascript
jQuery右侧选项卡焦点图片轮播特效代码分享
2015/09/05 Javascript
js行号显示的文本框实现效果(兼容多种浏览器 )
2015/10/23 Javascript
jQuery实现的模拟弹出窗口功能示例
2016/11/24 Javascript
基于Node.js模板引擎教程-jade速学与实战1
2017/09/17 Javascript
vue权限路由实现的方法示例总结
2018/07/29 Javascript
vue 自定义提示框(Toast)组件的实现代码
2018/08/17 Javascript
angularJs复选框checkbox选中进行ng-show显示隐藏的方法
2018/10/08 Javascript
Angular CLI 使用教程指南参考小结
2019/04/10 Javascript
树莓派中python获取GY-85九轴模块信息示例
2013/12/05 Python
python中的列表推导浅析
2014/04/26 Python
Python计算不规则图形面积算法实现解析
2019/11/22 Python
Python 获取命令行参数内容及参数个数的实例
2019/12/20 Python
用gpu训练好的神经网络,用tensorflow-cpu跑出错的原因及解决方案
2021/03/03 Python
LN-CC中国:高端男装和女装的奢侈时尚目的地
2019/09/14 全球购物
多媒体编辑专业毕业生推荐信
2013/11/05 职场文书
外语系毕业生找工作的求职信
2013/11/28 职场文书
汽车维修工岗位职责
2014/02/12 职场文书
我爱我校演讲稿
2014/05/21 职场文书
运动会跳远广播稿5篇
2014/09/17 职场文书
财政局党的群众路线教育实践活动整改方案
2014/09/21 职场文书
2014年终个人工作总结
2014/11/07 职场文书
社区三八妇女节活动总结
2015/02/06 职场文书
论语读书笔记
2015/06/26 职场文书
实例讲解Python中sys.argv[]的用法
2021/06/03 Python