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 - 委托( ...
随机推荐
- [New Learn]被嫌弃的app的一生
1.简介 为什么叫被嫌弃的app的一生?致敬电影<被嫌弃的松子的一生>. 自学IOS东一锄西一镐的总感觉没有一个总的概念,还是多看看官网吧,先看一下一个app的整个生命周期,本文主要是翻译 ...
- VMware无法识别USB设备
VMware虚拟机开始还能识别USB设备/U盘,突然就不行了,在网上找了好久,提供的方法大致如下: 1. 首先Ctrl+R启动运行,输入services.msc,找到一个VMware USB dr ...
- python 字典value排序
#!/usr/bin/env python#coding:utf-8s = {“a”:1,”b”:3,”c”:2} print sorted(s.iteritems(),key=lambda t:t[ ...
- Supervisor-类unix系统下的进程控制工具
如果你的英文足够好,请看官网的文档:http://supervisord.org/introduction.html 简介: Supervisor 类unix系统下的进程控制工具. 特性: 1.配置简 ...
- PTA L2-023 图着色问题-前向星建图 团体程序设计天梯赛-练习集
L2-023 图着色问题 (25 分) 图着色问题是一个著名的NP完全问题.给定无向图,,问可否用K种颜色为V中的每一个顶点分配一种颜色,使得不会有两个相邻顶点具有同一种颜色? 但本题并不是要你解 ...
- POJ 2777.Count Color-线段树(区间染色+区间查询颜色数量二进制状态压缩)-若干年之前的一道题目。。。
Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 53312 Accepted: 16050 Des ...
- JSP2 自定义标签
实现步骤 实现自定义标签的处理类继承javax.servlet.jsp.tagext.SimpleTagSupport,并重写doTag方法 建立标签库配置文件 在jsp中使用自定义标签 一个简单的标 ...
- ExtJs之表单(form)
--Form和Form Basic Extjs Form和Form Basic是两个东西,Form提供界面的展示,而Form Basic则提供数据的处理.验证等功能.每一个Form Panel在创建的 ...
- 第3天:YAML语法
YAML是一种可读性很强的数据格式语言.正是由于YAML良好的可读性,其广泛引用于软件配置中. 语法规则 YAML文件中的第一行为"---",表示这是一个YAML文件: YAML中 ...
- Python开发基础-Day7-闭包函数和装饰器基础
补充:全局变量声明及局部变量引用 python引用变量的顺序: 当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量 global关键字用来在函数或其 ...