一、函数的定义
1.function语句形式
//1.function语句式
function test1(){
alert("I am test1");
} test1();
2.函数直接量形式
//2.函数直接量形式
var test2 = function(){
alert("I am test2");
}
test2();
3.通过Function构造函数形式
Function构造函数可以接收任意数量的参数,但最后一个参数始终都被看成函数体。我们不推荐使用,因为这种语法会导致解析两次代码,第一次是解析常规的JS代码,第二次是解析传入构造函数中的字符串,从而影响性能。
//3.通过Function构造函数形式
var test3 = new Function("a","b","return a + b");
alert(test3(10,20));
4.三种方式的区别
/*
* 测试解析时机
*/
test1();// I am test1
function test1(){
alert("I am test1");
} test2();//报错
var test2 = function(){
alert("I am test2");
} alert(test3(10,20));
var test3 = new Function("a","b","return a + b");
function语句是会被JS解析器优先解析。
/*
* 测试函数作用域
*/ var k = 1; function test(){
var k = 2; function demo(){
return k;
} var demo = function(){
return k;
} var demo = new Function("return k"); //1.function语句式: 2
//2.function字面量式: 2
//3.Function构造函数式: 1
alert(demo()); } test();
二、arguments对象
JavaScript中每个函数内都能访问一个特别的变量就是arguments。这个变量维护着所有传递到这个函数中的参数列表。arguments变量不是一个数组,但是在语法上有数组相关的属性length。但它不从Array.prototype继承,实际上它是一个对象。因此无法对arguments变量使用标准的数组方法,比如push、pop等。虽然使用for循环遍历是可以的,但是为了更好的使用数组方法,最好把它转换为一个真正的数组。
alert("arguments[0] = " + arguments[0]); //1
alert("arguments[1] = " + arguments[1]); //2
alert("arguments.length = " + arguments.length); //3
alert("arguments.callee.length = " + arguments.callee.length); //2
alert("arguments.callee = " + arguments.callee);
return a + b;
} add(1,2,3);
从运行结果可以看出以下:
(1)arguments.length: 实参的个数。
(2)arguments.callee.length: 形参的个数。
(3)arguments.callee: 代表当前正在执行的函数,它可以在匿名函数中通过callee递归调用自身。
function add(a,b){ alert("arguments.callee.caller: " + arguments.callee.caller);
return a + b;
} function test(a,b){
add(a,b);
} test(1,2);
结果:
结论:
(1)arguments.callee.caller保存着调用当前函数的函数的引用。