1. arguments
?
在函数内部,arguments表示传入进来的参数,是个类似数组的Object。
?
function add(x, y, z) {
if (arguments.length != 3) {
throw new Error("f should called with 3 arguments!");
}
return x + y + z;
}
function max(/* ... */) {
var rst = Number.NEGATIVE_INFINITY;
for (var i = 0 ; i < arguments.length; ++i) {
if (arguments[i] > rst) {
rst = arguments[i];
}
}
return rst;
}
var f = function(x) {if (x <= 1) return 1; else return x * arguments.callee(x-1);}
document.write("1 + 2 + 3 = " + add(1, 2, 3) + "<br>");
//! document.write("1 + 2 = " + add(1, 2) + "<br>"); //throws Error
document.write("the max of 1, -10, -100, 2000, 5000, -10000 is "
+ max(1, -10, -100, 2000, 5000, -10000) + "<br>"
);
document.write("4! = " + f(4) + "<br>");
?
?
2. Javascript对待function其实和数据是一样的。
?
function add(x,y) {return x + y;}
function sub(x,y) {return x - y;}
function mul(x,y) {return x * y;}
function div(x,y) {return x / y;}
function operate(operator, op1, op2) {
return operator(op1, op2);
}
// i = (2 + 3) + (4 x 5)
var i = operate(add, operate(add, 2, 3), operate(mul, 4, 5));
document.write("(2 + 3) + (4 x 5) = " + i + "<br>");
?
?
3. 可以把一个function当作data赋值给一个object,这时这个function就是这个object的方法。
并且可以使用关键字this
?
var calculator = new Object();
calculator.op1 = 1;
calculator.op2 = 2;
calculator.op = function() {
this.result = this.op1 + this.op2;
}
calculator.op();
document.write("1 + 2 = " + calculator.result + "<br>");
?
?
4. length 和 callee两个属性
?
function check(args) {
if (args.length != args.callee.length) {
throw new Error("Wrong number of arguments!!!");
}
}
function add1(x, y, z) {
return x + y + z;
}
function add2(x, y, z) {
check(arguments);
return x + y + z;
}
document.write(add1("I", " love", " you!") + "<br>");
document.write(add1("I", " love") + "<br>");
document.write(add2("I", " love", " you!") + "<br>");
document.write(add2("I", " love") + "<br>");
?
?
5. call()和apply两个方法
?
function foo(x) {
document.write(x + "<br>");
}
foo(10);
foo.call(null,10);
?
?
6. closure
?
7. Function -- 作用域是不太一样的
?
var y = "global";
function constructFunction() {
var y = "local";
return new Function("return y"); // Does not capture the local scope!
}
// This line displays "global" because the function returned by the
// Function() constructor does not use the local scope. Had a function
// literal been used instead, this line would have displayed "local".
alert(constructFunction()()); // Displays "global"
?