/** * 6.callee属性 * Arguments对象除了有arguments属性,还有callee属性,用来引用当前正在执行的函数。这对匿名函数调用自身非常有用。 * 下面是一个计算阶乘的匿名函数. */ var v = function(x){if(x<=1)return 1; else return x*arguments.callee(x-1);} window.alert(v(5));
/** * 7.Function函数对象 * 函数是一种javascript对象,就行String对象和Date对象一样。同样具有属性和方法。 * Function对象具有length,这是个只读属性,该属性确切地说明了一个函数声明的形式参数的个数。不同于arguments的属性,arguments.length表示函数实际接收到的参数个数。 * 下面的check函数会检测函数接收到的实际参数个数和定义的参数个数是否相等,不等的话抛出错误。f函数应用了check函数。最后输出应该报错。 * 另外,Function对象还有一个prototype属性,表示预定义的原型对象。原型对象在使用new运算符把函数作为构造函数时起作用。它在定义新的对象类型时起着非常重要的作用。 */ function check(args){ var actual = args.length; var expected = args.callee.length; if(actual != expected){ throw new Error("Wrong number of arguments: expected:"+expected+" ;but actually passed "+actual); } }
function f(x, y, z){ check(arguments); return x+y+z; }
window.alert(f(2,5));
/** * 8.Function对象的apply方法和call方法 * 所有函数都有这两个方法。使用这两个方法就像用其他对象的方法医用。call()和apply()的第一个参数都是要调用的函数的对象,在函数体内这一参数是关键字this的值。call()的剩余参数是传递给要调用的函数的参数。 */ var o = new Object(); function f(x, y){return x+y;} o.m = f; window.alert(o.m(2,5)); //以上两行代码等价于f.call(o,2,5);