ECMAScript学习笔记(八)——函数表达式
栏目: JavaScript · 发布时间: 7年前
内容简介:JavaScript高级程序设计的第五章: 函数表达式在ECMAScript中,通过名字进行的递归,会由于函数被赋值到其他变量上,而导致错误:于是,应该这样解决:
JavaScript高级程序设计的第五章: 函数表达式
递归
在ECMAScript中,通过名字进行的递归,会由于函数被赋值到其他变量上,而导致错误:
function factorial(num) {
if (num <= 1) {
return 1;
} else {
return num * factorial(num - 1);
}
}
var anotherFactorial = factorial;
factorial = null;
alert(anotherFactorial); // error
于是,应该这样解决:
function factorial(num) {
if(num <= 1) {
return 1;
} else {
return num * arguments.callee(num - 1);
}
}
函数的arguments的callee对象指向了正在执行的函数的指针。
但是在严格模式下,是不能使用callee对象的。于是,可以使用明明函数表达式来达成相同的结果:
var factorial = (function f(num) {
if(num <= 1) {
return 1;
} else {
return f(num - 1);
}
})
上述代码,创建了一个名为f()的明明函数表达式。然后将它赋值给了factorial。这样一来,就算把函数赋值给了另一个变量,函数的名字f依然有效。
闭包
闭包是指,有权访问另一个函数作用域中的变量的函数。
创建闭包的常用方式,就是在一个函数内部创建另一个函数:
function createComparisonFunction(propertyName) {
return function(object1, object2) {
// 此处的两行代码,访问了外部函数的propertyName变量
var value1 = object1[propertyName];
var value2 = object2[propertyName];
if(value1 < value2) {
return -1;
} else if (value1 > value2) {
return 1;
} else {
return 0;
}
}
}
上述的:
var value1 = object1[propertyName]; var value2 = object2[propertyName];
这两行代码,访问来外部函数的propertyName变量。并且,即时这个内部函数被返回了,并且被其他地方调用了,它依旧可以访问propertyName变量。
这是因为,内部函数的作用域链中包含了createComparisonFunction()的作用域。
闭包与变量
闭包,只能取得包含函数中任何变量的最后一个值。意思就是说,闭包中获取的外部函数的变量的值,应该就它的最新的值。
function createFunction() {
var result = new Array();
for(var i = 0; i < 10; i++) {
result[i] = function() {
return i;
}
}
return result;
}
例如,以上代码中,每个函数都会返回10。因为,上述createFunction的活动对象引用的i是同一个变量。
我们可以这样做,来强制让闭包的行为符合预期:
function createFunctions () {
var result = new Array();
for (var i = 0; i < 10; i++) {
result[i] = function(num) {
return function() {
return num;
}
}(i);
}
return result;
}
this对象
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 【译】函数声明 VS 函数表达式
- 函数声明?函数表达式?我该怎么选?!
- JavaScript(js)函数声明与函数表达式的区别
- 深入理解 lambda表达式 与 函数式编程 函数式接口源码解析(二)
- 函数式编程1-Lambda表达式
- Java 函数式编程(二)Lambda表达式
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Linux集群体系结构
Alex Vrenios / 马朝晖 / 机械工业出版社 / 2003-1 / 38.00元
本书对Linux集群体系结构的硬件环境组建与其软件开发作了深入细致的介绍。通过阅读本书,可以对Linux集群体系结构有深入的认识,掌握并了解如何设计和构造集群计算机。本书使你了解到开发项目可能遇到的问题,并掌握测试和调整分布式算法。 本书适合计算机系统集成技术人员、管理人员和计算机科研人员作为参考。一起来看看 《Linux集群体系结构》 这本书的介绍吧!