《JavaScript高级程序设计》读书笔记(八):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类的实例。

属性和方法

  因为函数是引用类型,所以它们也有属性和方法,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()(闭包)。内部函数是个闭包,因为它将获取外部函数的参数iNum1iNum2以及全局变量iBaseNum的值。addNumbers()的最后一步调用了内部函数,把两个参数和全局变量相加,并返回它们的和。这里要掌握的重要概念是doAddtion()函数根本不接受参数,它使用的是从执行环境中获取的。

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

本文示例代码


本文转自Artwl博客园博客,原文链接:http://www.cnblogs.com/artwl/,如需转载请自行联系原作者

相关文章
|
3月前
|
Web App开发 JavaScript 前端开发
JavaScript 类(class)
JavaScript 类(class)
23 2
JavaScript 类(class)
|
3月前
|
JavaScript 前端开发 Java
JavaScript 类知识点概览
概览JavaScript中类的知识点,包括类的定义和实现、添加方法和get/set方法、类的继承和静态方法的使用。通过学生类和人员类的例子,演示了类的构造器、方法定义、继承关系和静态方法的调用。
JavaScript 类知识点概览
|
3月前
|
JavaScript 前端开发 开发者
JavaScript 类继承
JavaScript 类继承
22 1
|
3月前
|
JavaScript 安全
ES6中JS类实现的解读
ES6中JS类实现的解读
22 2
|
3月前
|
JavaScript 前端开发 索引
|
2月前
|
前端开发 JavaScript 开发者
深入理解JavaScript中的对象与类
深入理解JavaScript中的对象与类
16 0
|
3月前
|
C++ Windows
HTML+JavaScript构建C++类代码一键转换MASM32代码平台
HTML+JavaScript构建C++类代码一键转换MASM32代码平台
|
存储 安全 编译器
[笔记]读书笔记 C++设计新思维《一》基于策略的类设计(下)
[笔记]读书笔记 C++设计新思维《一》基于策略的类设计(下)
|
存储 算法 编译器
C++ Primer Plus 第6版 读书笔记(8)第 8章 函数探幽(二)
C++ Primer Plus 第6版 读书笔记(8)第 8章 函数探幽(二)
74 1
|
存储 算法 Java
[笔记]读书笔记 C++设计新思维《二》技术(Techniques)(二)
[笔记]读书笔记 C++设计新思维《二》技术(Techniques)(二)