1:在函数内部,有2个特殊的对象:arguments跟this;
2:arguments是一个类数组对象,包含着传入函数中的所有参数;主要用途是保存函数参数,但是这个对象还有一个名叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数;
function factorial(num){
if(num<=1){
return 1
}else{
return num*factorial(num-1)
}
}
console.log(factorial(5)) //120
function factorial2(num){
if(num<=1){
return 1
}else{
return num*arguments.callee(num-1)
}
}
console.log(factorial2(5)) //120
factorial这样做函数的执行跟函数名紧紧耦合在一起了,
factorial2消除了这种紧密耦合性,方便以后函数名的改动,无论函数名改成什么,都可以保证正常完成递归调用;
function factorial(num){
if(num<=1){
return 1
}else{
return num*factorial(num-1)
}
}
var truePactorial=factorial
factorial=function(){
return 0;
}
console.log(truePactorial(5)) //0
console.log(factorial(5)) //0
function factorial2(num){
if(num<=1){
return 1
}else{
return num*arguments.callee(num-1)
}
}
var truePactorial2=factorial2
factorial2=function(){
return 0;
}
console.log(truePactorial2(5)) //120
console.log(factorial2(5)) //0
3:this引用的函数据以执行的环境对象(网页的全局作用域中调用函数时,this对象引用的是window)
color='red'
var o={ color:'blue' }
function sayColor(){
console.log(this.color)
}
sayColor() //red,全局作用域中window.color
o.sayColor=sayColor
o.sayColor() //blue.this引用的对象是o;o.color
函数的名字仅仅是一个包含指针的变量;因此,即使在不同的执行环境中,全局的sayColor() 跟o.sayColor() 指向的仍然是同一个函数;
4:函数对象的另一个对象属性:caller;这个属性保存着当前函数的函数的引用(即谁调用的这个函数);如果实在全局环境中调用当前函数,他的值是null
function outer() {
console.log(outer.caller) //null
console.log(arguments.callee.caller) //null
inner()
}
function inner() {
console.log(inner.caller) //打印结果如下:
console.log(arguments.callee.caller) //打印结果如下:
// ƒ outer() {
// console.log(outer.caller) //null
// console.log(arguments.callee.caller) //null
// inner()
// }
}
outer()