请记住!每个函数都是Function类型的实例,因此函数名实际上也是一个指向函数对象的指针。
- 函数声明
alert(sum(10,10))
function sum(sum1,sum2){
return sum1+sum2;
}
由于解析器会率先读取函数声明,并在全体代码执行前执行了它,所以不会报错。
- 函数表达式
alert(sum(10,10))
var sum = function(sum1,sum2){
return sum1+sum2;
}
该代码会报错,因为系统找不到sum。
函数声明和函数表达式除了以上区别外,没什么不同了。
在函数内部有两个特殊的对象:arguments 和 this
还有个callee属性
arguments
arguments有一个名叫callee的属性,该属性是一个指针指向拥有这个argument对象的函数。举个阶乘的例子
function factorial(num){
if(num<=1){
return 1;
}
else{
return num*factorial(num-1)
}
}
var f= factorial
factorial = null
alert(f(10)); //报错,factorial is not a function
但这个函数只能针对factorial()这个函数,如上,当把函数变量赋值给了另外一个变量,且原函数设置为null时,就会出现bug了,为了解决这个问题,我们便可以采用arguments的callee属性,来指向自身这个函数
function factorial(num){
if(num<=1){
return 1;
}
else{
return num*arguments.callee(num-1)
}
}
var f= factorial
factorial = null
alert(f(10)); //3628800
this
this指的是当前的对象
window.color = "red";
var o = {
color:"blue";
}
function sayColor(){
return this.color;
}
sayColor(); //red
o.sayColor = sayColor;
o.sayColor(); //blue
caller
这个属性中保存着调用当前函数的函数的引用
function outer(){
inner();
}
function inner(){
alert(inner.caller);
}
outer();
以上会输出outer()的原函数,为了降低耦合性,也可以这样写
function outer(){
inner();
}
function inner(){
alert(arguments.callee.caller);
}
outer();