欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

js基础----函数的属性和方法(详细)

程序员文章站 2022-03-09 08:13:24
...

函数内部属性

1.函数内部属性

《JavaScript高级程序设计》课本内容

js基础----函数的属性和方法(详细)

1.1 arguments

arguments是一个类数组对象,包含着传入函数中的所有参数,主要用途是保存函数参数。无论实参是否被接收,argument实参列表都会被创建。arguments 是个类数组对象,其包含一个 length 属性,可以用 arguments.length 来获得传入函数的参数个数。

function sum(a) {
      // arguments -- [11,2,3] 实参列表
      console.log (arguments); //控制台输出arguments
      console.log (arguments.length); //控制台输出arguments长度
      }
    
sum(11,2,3);  //实际参数--实参

arguments有一个名叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数。 也即是说可以通过arguments.callee调用函数自身,一般用于函数的递归调用。 函数自己调用自己叫函数的递归调用。

  function factorial(num) {
        if(num<=1){
            return 1;
        }
    return num*factorial(num-1);       
    }

 上面计算阶乘函数的执行和函数名耦合程度很高,为了消除这种紧密耦合,我们可以采用arguments.callee这种方法。

    function factorial(num) {
        if(num<=1){
            return 1;
        }
    return num*arguments.callee(num-1); //无论调用的函数名是什么,都可以保证正常递归     
    }

 使用了arguments.callee();之后,如果引用的函数名发生改变,也同样可以保证正常递归 。但是,严格模式下,这样是会导致错误的。

1.2 this

js基础----函数的属性和方法(详细)

       function f1(){
            var user = '小猫';
            console.log(this.user);  //undefined
            console.log(this);   //object window
        }
        f1();  //实际上就是 window.f1();
//这里调用方法f1的是window对象,也就是说this指向window对象,所以会出现this.user 为undefined

2.函数的属性和方法 

js基础----函数的属性和方法(详细)

js基础----函数的属性和方法(详细)

js基础----函数的属性和方法(详细)

js基础----函数的属性和方法(详细)

js基础----函数的属性和方法(详细)

自己的总结:

call apply的作用都是改变this指向

call:call() 方法和apply() 方法作用相同, 区别在于接收参数的方式不同, call() 需要列举所有传入的所有参数。

function Person(name,age,sex){
    this.name=name;
    this.age=age;
    this.sex=sex;
}
function Student(name,age,sex,tel,grade){
    // var this={name:"",age:"",sex:""}
    //Student借用Person函数实现自己的功能(借助别人的方法实现自己的功能)
    Person.call(this,name,age,sex);//指定this指向,第一个参数是改变this指向。
    this.tel=tel;
    this.grade=grade;
}
var student=new Student("sunny",123,"female",18729407720,2021);
//call把实参按照形参个数传进去
console.log(student);

 call例子:

function sum(sum1, sum2) {
  return sum1 + sum2;
}
function sumCall1(sum1, sum2) {
    return sum.call(this, sum1, sum2); //列举传入的参数
}
console.log(sumCall1(10,20)); // 30

apply:apply()方法需要将实参封装到一个数组中统一传递(即使只有实参只有一个,也要放到数组中)。严格来说只接收argument对象和数组两种形式。

apply例子:

function sum(sum1, sum2) {
   return sum1 + sum2;
}
function sumApply1(sum1, sum2) {
    return sum.apply(this, arguments) // 传入arguments对象,this是改变指向
}
function sumApply2(sum1, sum2) {
    return sum.apply(this, [sum1, sum2]) // 传入数组
}
console.log(sumApply1(10,20)) // 30
console.log(sumApply2(10,20)) // 30

区别:

call(this, arg, arg1, arg2,…);
apply(this, [arg, arg1, arg2,…]);

call,apply的效果完全一样,它们的区别也在于:

  • 参数数量/顺序确定就用call,参数数量/顺序不确定的话就用apply。
  • 考虑可读性:参数数量不多就用call,参数数量比较多的话,把参数整合成数组,使用apply。
  • 参数集合已经是一个数组的情况,用apply,比如上文的获取数组最大值/最小值。
相关标签: 笔记 javascript