javascript function(函数类型)使用与注意事项小结


Posted in Javascript onJune 10, 2019

本文实例讲述了javascript function(函数类型)使用与注意事项。分享给大家供大家参考,具体如下:

在ECMAScript中,Function(函数)类型实际上是对象。每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法。由于函数是对象,因此函数名实际上也是一个指向函数对象的指针。

学习要点:

1.函数的声明方式
2.作为值的函数
3.函数的内部属性
4.函数属性和方法

一.函数的声明方式

1.普通的函数声明

function box(num1, num2) {
  return num1+ num2;
}

2.使用变量初始化函数

var box= function(num1, num2) {
  return num1 + num2;
};

3.使用Function构造函数

var box= new Function('num1', 'num2' ,'return num1 + num2');

PS:第三种方式我们不推荐,因为这种语法会导致解析两次代码(第一次解析常规ECMAScript代码,第二次是解析传入构造函数中的字符串),从而影响性能。但我们可以通过这种语法来理解"函数是对象,函数名是指针"的概念。

二.作为值的函数

ECMAScript中的函数名本身就是变量,所以函数也可以作为值来使用。也就是说,不仅可以像传递参数一样把一个函数传递给另一个函数,而且可以将一个函数作为另一个函数的结果返回。

function box(sumFunction, num) {
  return sumFunction(num); //someFunction
}
function sum(num) {
  return num + 10;
}
var result = box(sum, 10); //传递函数到另一个函数里

三.函数内部属性

在函数内部,有两个特殊的对象:argumentsthisarguments是一个类数组对象,包含着传入函数中的所有参数,主要用途是保存函数参数。但这个对象还有一个名叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数。

function box(num) {
  if (num <= 1) {
    return 1;
  } else {
    return num * box(num-1); //一个简单的的递归
  }
}

对于阶乘函数一般要用到递归算法,所以函数内部一定会调用自身;如果函数名不改变是没有问题的,但一旦改变函数名,内部的自身调用需要逐一修改。为了解决这个问题,我们可以使用arguments.callee来代替。

function box(num) {
  if (num <= 1) {
    return 1;
  } else {
    return num * arguments.callee(num-1);//使用callee来执行自身
  }
}

函数内部另一个特殊对象是this,其行为与Java和C#中的this大致相似。换句话说,this引用的是函数据以执行操作的对象,或者说函数调用语句所处的那个作用域。PS:当在全局作用域中调用函数时,this对象引用的就是window。

//便于理解的改写例子
window.color = '红色的'; //全局的,或者var color = '红色的';也行
alert(this.color); //打印全局的color
var box = {
  color : '蓝色的', //局部的color
  sayColor : function () {
    alert(this.color); //此时的this只能box里的color
  }
};
box.sayColor(); //打印局部的color
alert(this.color); //还是全局的
//引用教材的原版例子
window.color = '红色的'; //或者var color = '红色的';也行

var box = {
  color : '蓝色的'
};
function sayColor() {
  alert(this.color); //这里第一次在外面,第二次在box里面
}
getColor();
box.sayColor = sayColor; //把函数复制到box对象里,成为了方法
box.sayColor();

四.函数属性和方法

ECMAScript中的函数是对象,因此函数也有属性和方法。每个函数都包含两个属性:lengthprototype。其中,length属性表示函数希望接收的命名参数的个数。

function box(name, age) {
  alert(name + age);
}
alert(box.length); //2

PS:对于prototype属性,它是保存所有实例方法的真正所在,也就是原型。这个属性,我们将在面向对象一章详细介绍。而prototype下有两个方法:apply()call(),每个函数都包含这两个非继承而来的方法。这两个方法的用途都在特定的作用域中调用函数,实际上等于设置函数体内this对象的值。

function box(num1, num2) {
  return num1 + num2; //原函数
}
function sayBox(num1, num2) {
  return box.apply(this, [num1, num2]); //this表示作用域,这里是window
} //[]表示box所需要的参数
function sayBox2(num1, num2) {
  return box.apply(this, arguments); //arguments对象表示box所需要的参数
}

alert(sayBox(10,10)); //20
alert(sayBox2(10,10)); //20

call()方法于apply()方法相同,他们的区别仅仅在于接收参数的方式不同。对于call()方法而言,第一个参数是作用域,没有变化,变化只是其余的参数都是直接传递给函数的。

function box(num1, num2) {
  return num1 + num2;
}
function callBox(num1, num2) {
  return box.call(this, num1, num2); //和apply区别在于后面的传参
}
alert(callBox(10,10));

事实上,传递参数并不是apply()call()方法真正的用武之地;它们经常使用的地方是能够扩展函数赖以运行的作用域。

var color = '红色的'; //或者window.color = '红色的';也行
var box = {
  color : '蓝色的'
};
function sayColor() {
  alert(this.color);
}
sayColor(); //作用域在window
sayColor.call(this); //作用域在window
sayColor.call(window); //作用域在window
sayColor.call(box); //作用域在box,对象冒充

这个例子是之前作用域理解的例子修改而成,我们可以发现当我们使用call(box)方法的时候,sayColor()方法的运行环境已经变成了box对象里了。

使用call()或者apply()来扩充作用域的最大好处,就是对象不需要与方法发生任何耦合关系(耦合,就是互相关联的意思,扩展和维护会发生连锁反应)。也就是说,box对象和sayColor()方法之间不会有多余的关联操作,比如 box.sayColor = sayColor;

更多关于JavaScript相关内容可查看本站专题:《JavaScript常用函数技巧汇总》、《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript数学运算用法总结》

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

Javascript 相关文章推荐
JavaScript While 循环基础教程
Apr 05 Javascript
List Information About the Binary Files Used by an Application
Jun 11 Javascript
web 页面分页打印的实现
Jun 22 Javascript
自己的js工具 Cookie 封装
Aug 21 Javascript
Angular Js文件上传之form-data
Aug 28 Javascript
Web打印解决方案之普通报表打印功能
Aug 29 Javascript
Vue.js每天必学之数据双向绑定
Sep 05 Javascript
JavaScript的变量声明提升问题浅析(Hoisting)
Nov 30 Javascript
运用jQuery写的验证表单(实例讲解)
Jul 06 jQuery
vue.js实现的经典计算器/科学计算器功能示例
Jul 11 Javascript
layer.open关闭父窗口 以及调用父页面的方法
Aug 17 Javascript
微信小程序实现多选框全选与反全选及购物车中删除选中的商品功能
Dec 17 Javascript
浅谈ECMAScript 中的Array类型
Jun 10 #Javascript
微信小游戏之使用three.js 绘制一个旋转的三角形
Jun 10 #Javascript
JavaScript变量作用域及内存问题实例分析
Jun 10 #Javascript
JavaScript内置对象math,global功能与用法实例分析
Jun 10 #Javascript
vue通信方式EventBus的实现代码详解
Jun 10 #Javascript
Vue将页面导出为图片或者PDF
Aug 17 #Javascript
基于Bootstrap和JQuery实现动态打开和关闭tab页的实例代码
Jun 10 #jQuery
You might like
file_get_contents获取不到网页内容的解决方法
2013/03/07 PHP
从PHP $_SERVER相关参数判断是否支持Rewrite模块
2013/09/26 PHP
PHP去掉json字符串中的反斜杠\及去掉双引号前的反斜杠
2015/09/30 PHP
thinkPHP5.0框架配置格式、加载解析与读取方法
2017/03/17 PHP
php中如何执行linux命令详解
2018/11/06 PHP
一步一步教你写一个jQuery的插件教程(Plugin)
2009/09/03 Javascript
IE Firefox 使用自定义标签的区别
2009/10/15 Javascript
不要在cookie中使用特殊字符的原因分析
2010/07/13 Javascript
原生js实现淘宝首页点击按钮缓慢回到顶部效果
2014/04/06 Javascript
Enter回车切换输入焦点实现思路与代码兼容各大浏览器
2014/09/01 Javascript
深入剖析JavaScript面向对象编程
2016/07/12 Javascript
详解使用Visual Studio Code对Node.js进行断点调试
2017/09/14 Javascript
javascript基于牛顿迭代法实现求浮点数的平方根【递归原理】
2017/09/28 Javascript
JS实现求字符串中出现最多次数的字符和次数示例
2019/07/05 Javascript
Vue实现点击导航栏当前标签后变色功能
2020/08/19 Javascript
[01:24:16]2018DOTA2亚洲邀请赛 4.6 全明星赛
2018/04/10 DOTA
python中函数传参详解
2016/07/03 Python
Python实现简单生成验证码功能【基于random模块】
2018/02/10 Python
python实现简单名片管理系统
2018/11/30 Python
Python字符串、列表、元组、字典、集合的补充实例详解
2019/12/20 Python
Python count函数使用方法实例解析
2020/03/23 Python
在Django中自定义filter并在template中的使用详解
2020/05/19 Python
python绕过图片滑动验证码实现爬取PTA所有题目功能 附源码
2021/01/06 Python
分享8款纯CSS3实现的搜索框功能
2017/09/14 HTML / CSS
使用CSS3来实现滚动视差效果的教程
2015/08/24 HTML / CSS
美国设计师精美珠宝购物网:Netaya
2016/08/28 全球购物
Needle & Thread官网:英国仙女品牌
2018/01/13 全球购物
领先的英国注册在线药房 :Simply Meds Online
2019/03/28 全球购物
试述DBMS的主要功能
2016/11/13 面试题
初级软件工程师面试题 Junior Software Engineer Interview
2015/02/15 面试题
软件测试笔试题
2012/10/25 面试题
技术经理的自我评价范文
2013/12/03 职场文书
学习张林森心得体会
2014/09/10 职场文书
结婚典礼致辞
2015/07/28 职场文书
python 开心网和豆瓣日记爬取的小爬虫
2021/05/29 Python
SQLyog的下载、安装、破解、配置教程(MySQL可视化工具安装)
2022/09/23 MySQL