JavaScript基础学习(六)—函数
一、函数的定义
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保存着调用当前函数的函数的引用。
越努力,越幸运!