AI智能
改变未来

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


函数内部属性

1.函数内部属性

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

1.1 arguments

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

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

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

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

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

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

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

1.2 this

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

2.函数的属性和方法 

自己的总结:

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

call:

call()

 方法和

apply()

 方法作用相同, 区别在于接收参数的方式不同, 

call()

 需要列举所有传入的所有参数。

[code]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例子:

[code]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例子:

[code]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)) // 30console.log(sumApply2(10,20)) // 30

区别:

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

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

  • 参数数量/顺序确定就用call,参数数量/顺序不确定的话就用apply。
  • 考虑可读性:参数数量不多就用call,参数数量比较多的话,把参数整合成数组,使用apply。
  • 参数集合已经是一个数组的情况,用apply,比如上文的获取数组最大值/最小值。
赞(0) 打赏
未经允许不得转载:爱站程序员基地 » js基础—-函数的属性和方法(详细)