函数在声明后一般不会直接执行,需要进行调用才能运行
调用方法:
new Object();
函数名(实参列表);
function jc(n){
if(n == 1){
return 1;
} else {
return n*arguments.callee(n-1); //arguments.callee:用来指向拥有这个arguments对象的函数
} 此处也就是函数jc(n)
}
var result = jc(10); //方法一 函数名(实参列表)
console.log(result);
- 函数名.call(执行环境对象,实参列表);
function foo(a,b,c){
console.log(this,a,b,c);
}
foo(1,2,3);
foo.call({msg:'hello'},1,2,3) //方法二 函数名.call(执行环境对象,实参列表);
此处的执行环境对象就是console.log(this,a,b,c)中this所指的(因为this指向的是函数赖以执行的环境对象,此处this指向global)
- 函数名.apply(执行环境对象,实参列表数组);
function foo(a,b,c){
console.log(this,a,b,c);
}
foo(1,2,3);
foo.apply({msg:'hello'},[1,2,3]) //方法三 函数名.apply(执行环境对象,实参列表数组);
函数的内部属性 只有在函数的内部才能访问的属性
-
arguments
是类数组对象,包含着传入函数中参数,arguments对象还有一个callee的属性,用来指向拥有这个arguments对象的函数
function add(a,b){
console.log(arguments); //所有的实参都在这里
console.log(arguments.length); //数组长度
console.log(arguments.callee); //用来指向拥有这个arguments对象的函数
var total = a+b;
return total;
}
var result = add(1,2,3,4);
console.log(result);
输出结果:
{ ‘0’ : 1, ‘1’ : 2, ‘2’ : 3, ‘3’ : 4 } ;4 {Function : add} //arguments.callee所指向的函数,add;3
-
this
指向的是函数赖以执行的环境对象 sayHello(); this 指向 global/window obj.sayHello(); this 指向 obj a.sayHello(); this 指向 a 如何判断this指向谁:根据()前面的内容
demo:
var sayHello = function(){
console.log('hello',this);
}
var gender = 'male';
var obj ={
name:'xpf',
age:22,
gender:gender,
sayHello:sayHello
}
sayHello(); //this指向global
console.log("================="); //分隔符
obj.sayHello(); //this指向obj
可以看出:
sayHello(); this指向的是global(====上面一大串的东西)
obj.sayHello(); this指向的是obj