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 相关文章推荐
Display SQL Server Version Information
Jun 21 Javascript
让浏览器非阻塞加载javascript的几种方法小结
Apr 25 Javascript
jquery自定义属性(类型/属性值)
May 21 Javascript
php的文件上传入门教程(实例讲解)
Apr 10 Javascript
jQuery选择器总结之常用元素查找方法
Aug 04 Javascript
详解AngularJs中$resource和restfu服务端数据交互
Sep 21 Javascript
基于bootstrap风格的弹框插件
Dec 28 Javascript
seaJs使用心得之exports与module.exports的区别实例分析
Oct 13 Javascript
深入理解Vue router的部分高级用法
Aug 15 Javascript
JS编写兼容IE6,7,8浏览器无缝自动轮播
Oct 12 Javascript
jQuery/JS监听input输入框值变化实例
Oct 17 jQuery
vue 实现动态路由的方法
Jul 06 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
《JavaScript高级程序设计》阅读笔记(一) ECMAScript基础
Feb 27 #Javascript
You might like
一个PHP缓存类代码(附详细说明)
2011/06/09 PHP
php Session存储到Redis的方法
2013/11/04 PHP
php实现上传图片生成缩略图示例
2014/04/13 PHP
php截取字符串函数substr,iconv_substr,mb_substr示例以及优劣分析
2014/06/10 PHP
对PHP新手的一些建议(PHP学习经验总结)
2014/08/20 PHP
php 伪造ip以及url来路信息方法汇总
2014/11/25 PHP
windows下的WAMP环境搭建图文教程(推荐)
2017/07/27 PHP
js实现动画特效的文字链接鼠标悬停提示的方法
2015/03/02 Javascript
js闭包实现按秒计数
2015/04/23 Javascript
JavaScript中操作字符串之localeCompare()方法的使用
2015/06/06 Javascript
JS或jQuery获取ASP.NET服务器控件ID的方法
2015/06/08 Javascript
Nodejs如何复制文件
2016/03/09 NodeJs
AngularJS实现textarea记录只能输入规定数量的字符并显示
2016/04/26 Javascript
基于BootStrap Metronic开发框架经验小结【三】下拉列表Select2插件的使用
2016/05/12 Javascript
jquery datatable服务端分页
2016/08/31 Javascript
JavaScript常见事件对象与操作实例总结
2019/01/05 Javascript
微信提示 在浏览器打开 效果实现过程解析
2019/09/10 Javascript
原生JS与CSS实现软件卸载对话框功能
2019/12/05 Javascript
node.js中fs文件系统模块的使用方法实例详解
2020/02/13 Javascript
用jQuery实现抽奖程序
2020/04/12 jQuery
jQuery实现计算器功能
2020/10/19 jQuery
[53:21]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS LGD-CDEC
2014/05/22 DOTA
[48:47]VGJ.S vs NB 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[41:05]Serenity vs Pain 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
用Python制作简单的钢琴程序的教程
2015/04/01 Python
python+Django+apache的配置方法详解
2016/06/01 Python
解决python3运行selenium下HTMLTestRunner报错的问题
2018/12/27 Python
Python CSS选择器爬取京东网商品信息过程解析
2020/06/01 Python
使用keras时input_shape的维度表示问题说明
2020/06/29 Python
Python 高效编程技巧分享
2020/09/10 Python
Python创建自己的加密货币的示例
2021/03/01 Python
Ryderwear澳洲官网:澳大利亚高端健身训练装备品牌
2018/09/18 全球购物
Derek Rose官网:英国高档睡衣、家居服和内衣品牌
2020/01/18 全球购物
人力资源主管的岗位职责
2014/03/15 职场文书
2016全国“质量月”活动标语口号
2015/12/26 职场文书
基于docker安装zabbix的详细教程
2022/06/05 Servers