JavaScript基础入门教程(六)
说明
在看这篇博文之前还是希望读者阅读本系列前几篇文章,还有就是该系列需要读者拥有其它语言的编程基础,一些基本的知识点,比如什么是形参和实参将不再赘述。这篇博文主要讲函数。
函数的定义
在js种支持函数的嵌套定义,也就是说函数内部还能定义函数,这样一来就形成了闭包,它将给js带来非常强大的编程能力。在js种定义可以有两种形式,一种是声明方式定义函数,它和其它语言中常用的定义差不多,还有一种以表达式方式定义函数,它和和c语言中将函数赋值给函数指针的样子有点像。
//声明方式定义函数
function distance(x1, y1, x2, y2){
var dx = x2 - x1;
var dy = y2 - y1;
return Math.sqrt(dx*dx + dy*dy);
} //表达式方式定义函数
var square = function(x){
return x*x;
} //表达式方式也可以拥有名字,这在递归的时候很有用
var f = function fact(x){
if(x<=1) return 1;
return x*fact(x-1);
}
需要注意的是,这两种函数的定义方式存在些许的区别,声明方式只能在全局或者函数内部定义函数,但是这种方式定义的函数可以被与它同一作用域但是在它之前的代码所调用,因为在js中所有的声明都会被提前,关于声明提前的知识请参考这篇博客。表达式方式不仅能在全局还有函数内定义新的函数,而且能在if/for/...等语句块内定义函数,不过表达式方式定义的函数只会将var这个声明提前,而函数的定义实体(赋值这个动作)依然没有被提前,所以在它之前的代码不能调用表达式方式定义的函数。
倘若定义的函数没有return语句,或者return空值,那么调用者将得到这次调用的返回值为undefined。
函数的调用
函数的调用方式有以下四种
//作为函数被调用
alert("hello"); //作为方法被调用
var a=[2,5,3];
a.sort(); //作为构造函数被调用
var a = new Array(3); //被call()和apply()间接调用(下面分别通过call和apply调用toString函数)
Object.prototype.toString.call(new Date());
Object.prototype.toString.apply(new Date());
变参函数
arguments
这个东西从c语言开始就一直伴随我们,当我们在c语言中学的第一条语句使用printf时,你是否想过printf是一个变参函数(参数长度、类型都不确定)。js同样也支持变参函数,不过其实现和c语言稍有不同。在js中所有的实参将封装成类数组对象(类数组对象一个普通的对象,不过它的属性名以数组索引的方式定义,js好多地方都用到了类数组对象)。
function max(){
var ret=arguments[0];
for(var value of arguments){ //of关键字在ECMAScript6中才支持
if(value > ret)
ret = value;
}
//console.log(arguments instanceof Array) //-->false
return ret;
}
var maxValue = max(5, 7, 5, 56, 21, 0);
console.log(maxValue);
在上面的代码中所有的实参被封装到arguments这个类数组对象中,这个类对象数组也像数组一样支持用下标方式访问(比如上面代码第二行),它也含有length这个属性以便知道参数的个数,不过如果你的浏览器比较新,你可以使用ECMAScript6中的新语法of以直接得到对象的属性值。
callee和caller
如果你的英语单词中有employee和employer等单词,你可能已经明白这两个东西的意思了。其中callee表示当前正在执行的函数,caller表示调用这个正在执行的函数的函数,也就是说caller指代调用者。可惜在严格模式下的ECMAScript5中,这两个东西不让使用,不过在普通模式下它们非常有用,比如匿名函数的递归。
var factorial = function(x){
if (x<=1) return 1;
return x*arguments.callee(x-1);
}
自定义函数属性
函数在js中也是一个对象,如果你看过本系列之前的博客,基本上会见着不少于三次强调js中只有6中类型,其中函数是对象类型。这样一来函数也可以拥有自己的属性,有时候我们编程需要某一个函数在多次调用时共享一些数据,这就需要定义全局变量,然而全局变量定义多了以后会很难管理,因此我们更愿意定义函数属性。
//带缓存功能的阶乘计算函数 factorial[1]=1;//对这个不明白的同学去看上文推荐阅读的声明提前的博客。
function factorial(n){
if(isFinite(n) && n>0 && n==Math.round(n)){
if(!(n in factorial))
factorial[n] = n*factorial(n-1);
return factorial[n];
}
else return NaN;
}
JavaScript基础入门教程(六)的更多相关文章
- JavaScript基础入门教程(四)
说明 前面三篇博客介绍了js中基本的知识点,包括变量类型及其转换.表达式.运算符等小知识点,这篇博客主要讲的是对象.如果你学过java等语言,你也许在下文的阅读中发现在js中的对象与java中的对象存 ...
- JavaScript基础入门教程(二)
说明 前一篇博客介绍了js以及一些关于js基本类型的简单知识,本篇博客将详细介绍js的基础类型,捎带介绍对象类型,更详细的对象类型的说明将后续再讲. js中类型的说明 js中的类型分为基本类型和对象类 ...
- JavaScript基础入门教程(一)
本系列教程的说明 本教程说白了可以说是我自己学习JavaScript的笔记,主要内容参考自<JavaScript权威指南>,部分内容可能来自互联网,本系列教程假设学者之前学过c或者其它的编 ...
- JavaScript基础入门教程(五)
说明 本系列博客的第一篇已经说明了,要求阅读者需要具有其它语言的编程基础,所以关于组数的基础部分本篇博客将不再赘述,主要讲js中数组的特性. 创建数组 数组的创建主要有两种方法,一种是数组直接量,还有 ...
- JavaScript基础入门教程(三)
说明 前面的两篇博客介绍了js中的基本知识中的变量类型.标识符等.这篇博客主要谈表达式以及运算符. 原始表达式 原始表达式就是表达式中最小的,不能在分割的表达式,一般指变量.常数直接量.关键字(tru ...
- 无废话ExtJs 入门教程六[按钮:Button]
无废话ExtJs 入门教程六[按钮:Button] extjs技术交流,欢迎加群(201926085) 继上一节内容,我们在表单里加了个两个按钮“提交”与重置.如下所示代码区的第68行位置, butt ...
- PySide——Python图形化界面入门教程(六)
PySide——Python图形化界面入门教程(六) ——QListView和QStandardItemModel 翻译自:http://pythoncentral.io/pyside-pyqt-tu ...
- ECMAScript 6.0基础入门教程
ECMAScript 6.0基础入门教程 转:https://blog.csdn.net/hexinyu_1022/article/details/80778727 https://blog.csdn ...
- [置顶] IOS 基础入门教程
IOS 基础入门教程 教程列表: IOS 简介 IOS环境搭建 Objective C 基础知识 创建第一款iPhone应用程序 IOS操作(action)和输出口(Outlet) iOS - 委托( ...
随机推荐
- VPS性能综合测试(7):服务器压力测试,VPS系统负载测试
1.可能有的VPS主机使用性能测评工具得出的结果很优秀,但是最终运用到实际生产时却发现VPS主机根本无法承受理论上应该达到的流量压力,这时我们就不得不要怀疑VPS商是不是对VPS主机的参数进行了“篡改 ...
- [New learn] 设计模式思考
本文是对上文[New learn] 设计模式的思考总结 1.大框架 无论应用使用多少种设计模式和技巧,此模式都是应用的大框架.下图为本项目的基本架构图: 1.上图中大框架为经典的MVC模式. 2.Co ...
- 理解rest架构
越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency).高 ...
- tab切换 jQuery
$('p.guidan-load1').click(function(){ $("p.guidan-load1").removeClass("guidan-load12& ...
- 2:django models Making queries
这是后面要用到的类 class Blog(models.Model): name = models.CharField(max_length=100) tagline = models.TextFie ...
- html,js一个元素做两次不同点击事件
业务需求:一个按钮,第一次点击,修改页面内容,第二次点击,提交修改. 刚开始,我绑定了第一个click事件,用于让右边的内容可编辑.如:$('#id').click(function(){...}); ...
- linux命令(24):find命令
1.命令格式: find pathname -options [-print -exec -ok ...] 2.命令功能: 用于在文件树种查找文件,并作出相应的处理 3.命令参数: pathname: ...
- 【剑指offer】面试题 2. 实现 Singleton 模式
面试题 2. 实现 Singleton 模式 题目:设计一个类,我们只能生成该类的一个实例. 单例模式:确保一个类只有一个实例,并提供了一个全局访问点. Java 实现 1.饿汉模式 //饿汉模式 p ...
- python spyder 今天突然打不开了【已解决】
python spyder 我是设置开机启动的,先出现dos窗口,然后是蜘蛛网,后面就什么都没有了.然后百度了半天,在csdn看到一篇文章,试了一下,内牛满面! 方法:C:\Documents and ...
- (7) go 函数
1.格式 调用 2.包 (1)包 本质 文件夹.每一个文件都必须属于一个包 (2)给包取别名 (3)函数的首字母大小,决定是否能被外包访问 (3) 3.多返回值 4.递归 5.基本数据类型和数组都是拷 ...