ECMAScript学习笔记(八)——函数表达式

栏目: JavaScript · 发布时间: 6年前

内容简介: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对象


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

算法分析导论(第2版)(英文版)

算法分析导论(第2版)(英文版)

[美]Robert Sedgewick(罗伯特•塞奇威克)、[美]Philippe Flajolet(菲利普•弗拉若莱) / 电子工业出版社 / 2015-6 / 128.00元

《算法分析导论(第2版)(英文版)》全面介绍了算法的数学分析中所涉及的主要技术。涵盖的内容来自经典的数学课题(包括离散数学、初等实分析、组合数学),以及经典的计算机科学课题(包括算法和数据结构)。《算法分析导论(第2版)(英文版)》的重点是“平均情况”或“概率性”分析,书中也论述了“最差情况”或“复杂性”分析所需的基本数学工具。 《算法分析导论(第2版)(英文版)》第 1 版为行业内的经典著......一起来看看 《算法分析导论(第2版)(英文版)》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

SHA 加密
SHA 加密

SHA 加密工具