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

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

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


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

查看所有标签

猜你喜欢:

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

Powerful

Powerful

Patty McCord / Missionday / 2018-1-25

Named by The Washington Post as one of the 11 Leadership Books to Read in 2018 When it comes to recruiting, motivating, and creating great teams, Patty McCord says most companies have it all wrong. Mc......一起来看看 《Powerful》 这本书的介绍吧!

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

html转js在线工具
html转js在线工具

html转js在线工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具