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.三种方式的区别

     image

			/*
			 * 测试解析时机
			 */
			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);
结果:

     image

结论:

     (1)arguments.callee.caller保存着调用当前函数的函数的引用。

原文地址:https://www.cnblogs.com/yangang2013/p/5440330.html