JavaScript Function类与闭包详解:构造函数、属性方法及实战应用

作者:拾光

时间:2026-10-26

浏览:184

本文深入解析JavaScript中的Function类与闭包机制。详细阐述Function构造函数的语法及其性能局限,介绍length、valueOf和toString等核心属性与方法。通过具体代码示例,演示如何利用闭包访问外部变量及执行复杂计算,帮助开发者掌握函数式编程的关键概念。

文章目录

Function类概述

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类的实例。


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>

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章