日期:2014-05-16  浏览次数:20522 次

javascript学习笔记四

7章函数表达式

?????? 定义函数的方式有两种:一种是函数声明,另一种就是函数表达式。

?????? 关于函数声明,它的一个重要特征就是函数声明提升(function declaration hoisting),意思是在执行代码之前会先读取函数声明。这就意味着可以把函数声明放在调用它的语句后面。

?????? 第二种创建函数的方式是使用函数表达式。函数表达式有几种不同的语法形式。下面是最常见的一种形式。

?????? varfunctionName=function(arg0,arg1,arg2)

?????? {

????????????? //函数体

?????? }

?????? 这种形式看起来好像是常规的变量赋值语句,即创建一个函数并将它赋值给变量functionName。这种情况下创建的函数叫做匿名函数(anonymous function),因为function关键字后面没有标识符。(匿名函数有时候也叫拉姆达函数。)匿名函数的name属性是空字符串。

7.1递归

?????? arguments.callee是一个指向正在执行的函数的指针,因此可以用它来实现对函数的递归调用。

?????? function factorial(num)

?????? {

????????????? if(num<=1) {

???????????????????? return 1;

????????????? }else{

???????????????????? returnnum*arguments.callee(num-1);

????????????? }

?????? }

7.2 闭包

?????? 闭包是指有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式,就是在一个函数内部创建另一个函数。

?????? 当某个函数第一次被调用时,会创建一个执行环境(execution context)及相应的作用域链,并把作用域链赋值给一个特殊的内部属性(即[[Scope]])。然后,使用thisarguments和其他命名参数的值来初始化函数的活动对象(activation object)。但在作用域链中,外部函数的活动对象始终处于第二位,外部函数的外部函数的活动对象处于第三位,……直至作为作用域链终点的全局执行环境。

?????? 后台的每个执行环境都有一个表示变量的对象——变量对象。

?????? 作用链本质上是一个执行变量对象的指针列表,它只引用但不实际包含变量对象。

?????? 在另一个函数内部定义的函数会将包含函数(即外部函数)的活动对象添加到它的作用域链中。

7.2.1 闭包与变量

?????? 作用域链的这种配置机制引出了一个值得注意的副作用,即闭包只能取得包含函数中任何变量的最后一个值。别忘了闭包所保存的是整个变量对象,而不是某个特殊的变量。

7.2.2 关于this对象

?????? this对象是在运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被作为某个对象的方法调用时,this等于那个对象。不过匿名函数的执行环境具有全局性,因此其this对象通常指向wind