JavaScript高级程序设计 读书笔记之八 Function类及闭包


Posted in Javascript onFebruary 27, 2012

Function类

定义

Function类可以表示开发者定义的任何函数,用Function类直接创建函数的语法如下:

var function_name=new Function(agrument1,agrument2,...,argumentN,function_body);

每个argument都是一个参数,最后一个参数是函数主体(要执行的代码)。

示例:

function sayHi(sName,sMessage){ 
alert("Hello "+sName+","+sMessage); 
}

还可以如下定义它:
var sayHi=new Function("sName","sMessage","alert(\"Hello\"+sName+\",\"+sMessage);");

注:尽管可用Function构造函数创建函数,但最好不要使用它,因为用它定义函数比用传统方式要慢得多。不过,所有函数都应看作是Function类的实例。
属性和方法

因为函数是引用类型,所以它们也有属性和方法,ECMAScript定义的属性length声明了函数期望的参数个数,例如:

function doAdd(iNum){ 
alert(iNum+10); 
} 
function sayHi(){ 
alert("Hi"); 
} 
alert(doAdd.length);//outpus 1 
alert(sayHi.length);//outpus 0

Function对象也有与所有对象共享的标准valueOf()方法和toString()方法,这两个方法返回的都是函数的源代码,在调试时尤其有用。

例如:

function doAdd(iNum){ 
alert(iNum+10); 
} 
alert(doAdd.toString());

这段代码输出了doAdd()函数的文本。
闭包
定义

所谓闭包,是指词法表示包括不必计算的变量的函数,也就是说,该函数能使用函数外定义的变量。在ECMAScript中使用全局变量是一个简单的闭包实例。

示例:

var sMessage="Hello World"; 
function sayHelloWold(){ 
alert(sMessage); 
} 
sayHelloWorld();

在一个函数中定义另一个函数会使闭包变得更复杂,如:
var iBaseNum=10; 
function addNumbers(iNum1,iNum2){ 
function doAddtion(){ 
return iNum1+iNum2+iBaseNum; 
} 
return doAddtion(); 
}

这里函数addNumbers()包括函数doAddtion()(闭包)。内部函数是个闭包,因为它将获取外部函数的参数iNum1和iNum2以及全局变量iBaseNum的值。addNumbers()的最后一步调用了内部函数,把两个参数和全局变量相加,并返回它们的和。这里要掌握的重要概念是doAddtion()函数根本不接受参数,它使用的是从执行环境中获取的。

可以看到,闭包是ECMAScript中非常强大多用的一部分,可以用于执行复杂的计算。就像使用任何高级函数一样,在使用闭包时要当心,因为它们可能会变得非常复杂。
本文示例代码

<!DOCTYPE html> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 
<title>《JavaScript高级程序设计》读书笔记之八:Function类及闭包</title> 
<script type="text/javascript"> 
function doAdd(iNum){ 
alert(iNum+10); 
} 
function sayHi(){ 
alert("Hi"); 
} 
function lengthProperty(){ 
alert(doAdd.length); 
alert(sayHi.length); 
} 
function valueOfMethod(){ 
alert(doAdd.valueOf()); 
} 
function toStringMethod(){ 
alert(doAdd.toString()); 
} 
var sMessage="Hello World"; 
function sayHelloWorld(){ 
alert(sMessage); 
} 
function demoOne(){ 
sayHelloWorld(); 
} 
var iBaseNum=10; 
function addNumbers(iNum1,iNum2){ 
function doAddtion(){ 
return iNum1+iNum2+iBaseNum; 
} 
return doAddtion(); 
} 
function demoTwo(){ 
alert(addNumbers(1,2)); 
} 
</script> 
</head> 
<body> 
<h1>Length:</h1> 
<input type="button" onclick="lengthProperty()" value="LengthProperty"/> 
<h1>valueOf()/toString():</h1> 
<input type="button" onclick="valueOfMethod()" value="ValueOfMethod"/> 
<input type="button" onclick="toStringMethod()" value="ToStringMethod"/> 
<h1>闭包:</h1> 
<input type="button" onclick="demoOne()" value="Demo One"/> 
<input type="button" onclick="demoTwo()" value="Demo Two"/> 
</body>
Javascript 相关文章推荐
有关js的变量作用域和this指针的讨论
Dec 16 Javascript
jquery插件unobtrusive实现片段式加载
Jun 15 Javascript
js实现交通灯效果
Jan 13 Javascript
EL表达式截取字符串的函数说明
Sep 22 Javascript
vue配置多页面的实现方法
May 22 Javascript
JavaScript ES6箭头函数使用指南
Dec 30 Javascript
亲自动手实现vue日历控件
Jun 26 Javascript
vue项目部署到nginx/tomcat服务器的实现
Aug 26 Javascript
vue实现跳转接口push 转场动画示例
Nov 01 Javascript
详解vue 组件注册
Nov 20 Vue.js
vue表单验证之禁止input输入框输入空格
Dec 03 Vue.js
详解vue中使用transition和animation的实例代码
Dec 12 Vue.js
JavaScript高级程序设计 阅读笔记(七) ECMAScript中的语句
Feb 27 #Javascript
JavaScript高级程序设计阅读笔记(六) ECMAScript中的运算符(二)
Feb 27 #Javascript
JavaScript高级程序设计阅读笔记(五) ECMAScript中的运算符(一)
Feb 27 #Javascript
JavaScript高级程序设计 阅读笔记(四) ECMAScript中的类型转换
Feb 27 #Javascript
《JavaScript高级程序设计》阅读笔记(三) ECMAScript中的引用类型
Feb 27 #Javascript
《JavaScript高级程序设计》阅读笔记(二) ECMAScript中的原始类型
Feb 27 #Javascript
《JavaScript高级程序设计》阅读笔记(一) ECMAScript基础
Feb 27 #Javascript
You might like
PHP开发中常用的字符串操作函数
2011/02/08 PHP
phplot生成图片类用法详解
2015/01/06 PHP
PHP正则验证Email的方法
2015/06/15 PHP
PHP中session跨子域的三种实现方法
2016/07/25 PHP
redirect_uri参数错误的解决方法(必看)
2017/02/16 PHP
PHP匿名函数(闭包函数)详解
2019/03/22 PHP
比较不错的JS/JQuery显示或隐藏文本的方法
2014/02/13 Javascript
开发中可能会用到的jQuery小技巧
2014/03/07 Javascript
了不起的node.js读书笔记之mongodb数据库交互
2014/12/22 Javascript
JavaScript数据结构和算法之图和图算法
2015/02/11 Javascript
AngularJs中route的使用方法和配置
2016/02/04 Javascript
JQUERY表单暂存功能插件分享
2016/02/23 Javascript
AngularJS模板加载用法详解
2016/11/04 Javascript
Ajax异步文件上传与NodeJS express服务端处理
2017/04/01 NodeJs
史上最全JavaScript数组去重的十种方法(推荐)
2017/08/17 Javascript
[00:03]DOTA2新版本PA至宝展示
2014/11/19 DOTA
Django在Win7下的安装及创建项目hello word简明教程
2014/07/14 Python
利用Python查看微信共同好友功能的实现代码
2019/04/24 Python
Python创建或生成列表的操作方法
2019/06/19 Python
python清空命令行方式
2020/01/13 Python
PyQt5中QTableWidget如何弹出菜单的示例代码
2020/02/23 Python
德国网上药房:Apotal
2017/04/04 全球购物
以色列的身体护理及家居香薰品牌:Sabon NYC
2018/02/23 全球购物
Amara德国:家居饰品、设计师品牌和豪华礼品
2019/05/20 全球购物
Mamaearth官方网站:印度母婴护理产品公司
2019/10/06 全球购物
Super-Pharm波兰:药房和香水在一个地方
2020/08/18 全球购物
英国独特家具和家庭用品购物网站:Cuckooland
2020/08/30 全球购物
linux面试题参考答案(8)
2015/08/11 面试题
小学社团活动总结
2014/06/27 职场文书
商务经理岗位职责
2014/07/30 职场文书
三八妇女节慰问信
2015/02/14 职场文书
党支部综合考察意见
2015/06/01 职场文书
雨中的树观后感
2015/06/03 职场文书
2015年女工委工作总结
2015/07/27 职场文书
2016年党员干部公开承诺书
2016/03/24 职场文书
2016年庆“七一”主题党日活动总结
2016/04/05 职场文书