js基础----函数的属性和方法(详细)
程序员文章站
2022-03-09 08:13:24
...
函数内部属性
1.函数内部属性
《JavaScript高级程序设计》课本内容
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
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.函数的属性和方法
自己的总结:
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,比如上文的获取数组最大值/最小值。