日期:2014-05-16 浏览次数:20522 次
?????? 定义函数的方式有两种:一种是函数声明,另一种就是函数表达式。
?????? 关于函数声明,它的一个重要特征就是函数声明提升(function declaration hoisting),意思是在执行代码之前会先读取函数声明。这就意味着可以把函数声明放在调用它的语句后面。
?????? 第二种创建函数的方式是使用函数表达式。函数表达式有几种不同的语法形式。下面是最常见的一种形式。
?????? varfunctionName=function(arg0,arg1,arg2)
?????? {
????????????? //函数体
?????? }
?????? 这种形式看起来好像是常规的变量赋值语句,即创建一个函数并将它赋值给变量functionName。这种情况下创建的函数叫做匿名函数(anonymous function),因为function关键字后面没有标识符。(匿名函数有时候也叫拉姆达函数。)匿名函数的name属性是空字符串。
?????? arguments.callee是一个指向正在执行的函数的指针,因此可以用它来实现对函数的递归调用。
?????? function factorial(num)
?????? {
????????????? if(num<=1) {
???????????????????? return 1;
????????????? }else{
???????????????????? returnnum*arguments.callee(num-1);
????????????? }
?????? }
?????? 闭包是指有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式,就是在一个函数内部创建另一个函数。
?????? 当某个函数第一次被调用时,会创建一个执行环境(execution context)及相应的作用域链,并把作用域链赋值给一个特殊的内部属性(即[[Scope]])。然后,使用this、arguments和其他命名参数的值来初始化函数的活动对象(activation object)。但在作用域链中,外部函数的活动对象始终处于第二位,外部函数的外部函数的活动对象处于第三位,……直至作为作用域链终点的全局执行环境。
?????? 后台的每个执行环境都有一个表示变量的对象——变量对象。
?????? 作用链本质上是一个执行变量对象的指针列表,它只引用但不实际包含变量对象。
?????? 在另一个函数内部定义的函数会将包含函数(即外部函数)的活动对象添加到它的作用域链中。
?????? 作用域链的这种配置机制引出了一个值得注意的副作用,即闭包只能取得包含函数中任何变量的最后一个值。别忘了闭包所保存的是整个变量对象,而不是某个特殊的变量。
?????? this对象是在运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被作为某个对象的方法调用时,this等于那个对象。不过匿名函数的执行环境具有全局性,因此其this对象通常指向wind