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 - 委托( ...
随机推荐
- C#通过反射获取类中的方法和参数个数,反射调用方法带参数
using System; using System.Reflection; namespace ConsoleApp2 { class Program { static void Main(stri ...
- vue知识点(1)
处理用户输入 v-on指令添加一个事件监听器 div id="app-5"> <p>{{ message }}</p> <button v-on ...
- 关于aspxgridview里面过长内容只显示的一部分的处理方案
protected void g_Message_CustomColumnDisplayText(object sender, ASPxGridViewColumnDisplayTextEventAr ...
- C#ActiveX控件开发
1.新建项目,选择C#,选择.NET Framework2.0,新建一个Windows窗体控件库项目,命名为ActiveXDemo; 2.右击ActiveXDem项目,选择属性——应用程序——程序集信 ...
- CSS3 icon font
大家都知道现在各个浏览器都支持CSS3的自定义字体(@font-face),包括IE6都支持,只是各自对字体文件格式的支持不太一样.那么对于网站中用到的各种icon,我们就可以尝试使用font来实现, ...
- windows server 2012 IIS配置之FTP站点
原文地址:[原创]winserver2012IIS配置之FTP站点作者:hkmysterious 一.实验拓扑: 使server2012客户计算机通过ftp方式从FTP服务器上下载已上传并共享的文 ...
- awk处理之案例五:awk匹配字段2包含字段1的文本
编译环境 本系列文章所提供的算法均在以下环境下编译通过. [脚本编译环境]Federa 8,linux 2.6.35.6-45.fc14.i686 [处理器] Intel(R) Core(TM)2 Q ...
- Django 批量导入文件
1. 按照xlrd软件 pip3 install xlrd 2. POST提交文件获取数据 方法一:写入硬盘,xlrd读取xlsx文件获取文件数据 def batch_view(self,reques ...
- LeetCode解题报告—— Number of Islands & Bitwise AND of Numbers Range
1. Number of Islands Given a 2d grid map of '1's (land) and '0's (water), count the number of island ...
- python import模块的搜索路径
当在py代码中import所依赖的模块时, python是从哪里找到这些模块呢,即模块的搜索路径是啥? 默认情况下,Python解释器会搜索当前目录.所有已安装的内置模块和第三方模块,搜索路径存放在s ...