标签:
定义函数的方式有三种:
eg: var sum = new Function(“num1", "num2", "return num1 + num2");
使用前两种方式定义该函数:
使用函数声明语句和函数定义表达式都包含三部分:
所以上面两种形式其实是这样的:
var f = function fact(x){ if(x <=1){ return 1; }else { return x * fact(x-1); //递归使用该函数 } }
这两种定义方式都会创建一个新的函数对象。函数名实际上是一个指向该函数对象的指针,而不会与某个函数绑定。
意思就是呢,函数体就在那里,不会动,可以通过函数名来引用该函数进行操作,两者其实是相对独立,但又有着某种关系。看下面例子:
1 function sum(num1,num2){ 2 return num1 + num2; 3 } 4 alert(sum(10,10)); //20 5 6 var anotherSum = sum; 7 alert(anotherSum(10,10)); //20 8 sum = null; 9 alert(anotherSum(10,10)); //20
这里的sum是函数名,可以通过sum引用到该函数,第6行将sum的值赋给anotherSum,这样anotherSum也可以访问到该函数体了,第8行将变量sum设为null,就是将它和函数体之间的关系切断,但函数体依然独立存在,不会受影响,从而anotherSum依旧可以引用到它,所以变量名就是一个指针而已。
理解完指针后,再来看看函数重载,EMACAScript里没有函数重载的概念,什么是重载呢?
1 function addSomeNumber(num){ 2 return num + 100; 3 } 4 function addSomeNumber(num){ 5 return num + 300; 6 } 7 var result = addSomeNumber(100); //400 8
//换一种方式: 9 var addSomeNumber = function(num){ 10 return num + 100; 11 }; 12 addSomeNumber = function(num){ 13 return num + 300; 14 }; 15 16 var result = addSomeNumber(100); //400
所以没有重载其实就是,覆盖函数引用,当创建了第二个函数体时,函数名就会指向新创建的函数体,从而覆盖之前引用的函数体,
函数声明与函数定义表达式的不同:
主要的不同是函数声明提前,有点像使用var 定义变量时,变量声明会提前,但初始化仍在原位置,但函数声明会让函数名和函数体都提前,将它们添加到执行环境中去,所以在声明该函数前就可以使用该函数。而函数定义表达式则不能提前,必须要执行到它后才会有效。
alert(sum(10,10)); //这里就声名提前了, function sum(num1,num2){ return num1 + num2; } alert(sum(10,10)); //这里就会出现错误 var sum = function(num1, num2){ return num1 + num2; };
二者的区别就是什么时候可以访问到函数。其他都是等价的。
12:45:22、、2016-01-10
标签:
原文地址:http://www.cnblogs.com/liurenxingyu/p/5117832.html