说明

  在看这篇博文之前还是希望读者阅读本系列前几篇文章,还有就是该系列需要读者拥有其它语言的编程基础,一些基本的知识点,比如什么是形参和实参将不再赘述。这篇博文主要讲函数。

函数的定义

  在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基础入门教程(六)的更多相关文章

  1. JavaScript基础入门教程(四)

    说明 前面三篇博客介绍了js中基本的知识点,包括变量类型及其转换.表达式.运算符等小知识点,这篇博客主要讲的是对象.如果你学过java等语言,你也许在下文的阅读中发现在js中的对象与java中的对象存 ...

  2. JavaScript基础入门教程(二)

    说明 前一篇博客介绍了js以及一些关于js基本类型的简单知识,本篇博客将详细介绍js的基础类型,捎带介绍对象类型,更详细的对象类型的说明将后续再讲. js中类型的说明 js中的类型分为基本类型和对象类 ...

  3. JavaScript基础入门教程(一)

    本系列教程的说明 本教程说白了可以说是我自己学习JavaScript的笔记,主要内容参考自<JavaScript权威指南>,部分内容可能来自互联网,本系列教程假设学者之前学过c或者其它的编 ...

  4. JavaScript基础入门教程(五)

    说明 本系列博客的第一篇已经说明了,要求阅读者需要具有其它语言的编程基础,所以关于组数的基础部分本篇博客将不再赘述,主要讲js中数组的特性. 创建数组 数组的创建主要有两种方法,一种是数组直接量,还有 ...

  5. JavaScript基础入门教程(三)

    说明 前面的两篇博客介绍了js中的基本知识中的变量类型.标识符等.这篇博客主要谈表达式以及运算符. 原始表达式 原始表达式就是表达式中最小的,不能在分割的表达式,一般指变量.常数直接量.关键字(tru ...

  6. 无废话ExtJs 入门教程六[按钮:Button]

    无废话ExtJs 入门教程六[按钮:Button] extjs技术交流,欢迎加群(201926085) 继上一节内容,我们在表单里加了个两个按钮“提交”与重置.如下所示代码区的第68行位置, butt ...

  7. PySide——Python图形化界面入门教程(六)

    PySide——Python图形化界面入门教程(六) ——QListView和QStandardItemModel 翻译自:http://pythoncentral.io/pyside-pyqt-tu ...

  8. ECMAScript 6.0基础入门教程

    ECMAScript 6.0基础入门教程 转:https://blog.csdn.net/hexinyu_1022/article/details/80778727 https://blog.csdn ...

  9. [置顶] IOS 基础入门教程

    IOS 基础入门教程 教程列表: IOS 简介 IOS环境搭建 Objective C 基础知识 创建第一款iPhone应用程序 IOS操作(action)和输出口(Outlet) iOS - 委托( ...

随机推荐

  1. 2017多校第8场 HDU 6138 Fleet of the Eternal Throne 思维,暴力

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6138 题意:给了初始区间[-1,1],然后有一些操作,可以r加上一个数,l减掉一个数,或者同时操作,问 ...

  2. Pylot网站Web服务器性能和负载压力测试-适用Windows可绘制图表

    为了能够准确地评估网站服务器对网络流量的承受能力,我们一般会采取模拟网站用户访问,通过不断地增加并发数,延长访问时长,从而最终得出网站Web服务器的性能和负载能力.当然也可以通过Web压力测试,来完善 ...

  3. 10 个打造 React.js App 的最佳 UI 框架

    10 个打造 React.js App 的最佳 UI 框架 在本文中,我们将分享一些助你打造 React.js App 最佳的 UI 框架.它们具备你所需要的基本 React 组件,以及易用的 API ...

  4. ES6 promise简单实现

    基本功能实现: function Promise(fn){ //需要一个成功时的回调 var doneCallback; //一个实例的方法,用来注册异步事件 this.then = function ...

  5. leetcode 之Plus One(9)

    这题需要注意的是最后的进位 vector<int> plusOne(vector<int>& nums,int num) { add(nums, num); } voi ...

  6. Xshell 找到上次执行的命令

    ctrl + p   返回上一次输入命令字符 ctrl + r       输入单词搜索历史命令

  7. 爬虫基础库之requests

    requests Python标准库中提供了:urllib.urllib2.httplib等模块以供Http请求,但是,它的 API 太渣了.它是为另一个时代.另一个互联网所创建的.它需要巨量的工作, ...

  8. SQL Server 连接字符串和身份验证 学习

    SQL Server .NET Data Provider 连接字符串包含一个由一些属性名/值对组成的集合.每一个属性/值对都由分号隔开.          PropertyName1=Value1; ...

  9. AC日记——[ZJOI2012]网络 bzoj 2816

    2816 思路: 多个LCT: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 10005 #define l ...

  10. mybatis 报错: Invalid bound statement (not found)

    错误: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): test.dao.Produc ...