函数作为对象的成员介绍

233 阅读2分钟

函数作为对象的成员介绍

// 函数作为一个对象,聊聊里面的成员: 
function test(){
    console.log('我是一个函数');
}
console.dir(test);// 声明一个函数,输出这个函数对象,看看里面有些什么成员.


// 1.caller属性
// test2这个函数是在test1中调用的,那test2的caller就是test1. 
// test2这个函数没有在另外一个函数中调用,而是在全局作用域中调用的,那test2的caller就是null. 
function test1(){
    console.log('我是test1');
    test2();
}
function test2(){
    console.log('我是test2');
    console.log(test2.caller);
}
test1();
test2();


//2. length属性
// 函数形参的个数. 
function test1(num1,num2,num3,num4){
    console.log('哈哈啊,我是test1',test1.length);
}
test1(10,20,30);


//3. name属性
//函数的名称
function test1(){
    console.log(test1.name);
}
test1();

let fn1 = function(){
    console.log(fn1.name);
}
fn1();


//4. arguments属性
//伪数组,存放的是实参的值.  和以前讲过的arguments是不一样的. arguments实际上是当前函数的一个内置对象。所有函数都内置一个arguments对象,arguments对象中存储了传递的所有实参。
//以前讲过的arguments和形参一一对应, 但是我们现在讲的函数对象.arguments没有和形参一一对应.
// arguments[0]表示第一个实参
// arguments[1]表示第二个实参
function test1(num1,num2){
    num1 = 100;
    console.log(arguments);//常用
    console.log(test1.arguments);//并不常用. 
    console.log(arguments === test1.arguments);//false

}
test1(10,20,30);

复习arguments

// 伪数组,存放的是一个个实参的值. 
// 他和形参一一对应. 
function test(num1,num2){
    //num1 = 100;
    //arguments[0] = 100;
    console.log(arguments);
    //console.log(num1);


    // 既然arguments是一个对象, 那他里面应该也有一些成员. 
    //1. callee
    // 是函数本身. 
    // console.log(arguments.callee);

    //2. length
    // 实参的个数
    console.log(arguments.length);

}
test(10,20,30,40,50,60,70,80);







//----------------------------
// arguments.callee的使用场景
// 需求: 匿名函数做递归
let i = 0;
(function () {
    i++;
    //函数内部调用函数自己
    console.log('哈哈'+i);
    if (i < 3) {
        arguments.callee();
    }
    console.log('呵呵'+i);
}());
// 计算任意数值的和
function sum() {
var result;
for(var i=0; i<= arguments.length;i++){
result += arguments[i]
}
return result
}