函数的内部属性argument介绍:
1、该对象是函数的内部的对象,只能在函数体中使用,直接使用即可。
2、arguments是一个对象,用来代表实参数据。
(1)arguments对象有一个属性,length:代表了实参的个数。
(2)arguments对象中的实参数据,每个实参都对应一个序号,序号从0开始。依次递增。通过arguments【序号】访问。
(3)arguments对象能够实现js中的重载功能。
(4)一般情况下使用形参来接收实参数据,但是如果函数的参数是要求变化的,可使用arguments来代替形参接受实参数据。
(5)arguments对象还有一个属性callee.该属性也是一个对象,代表当前函数自身,主要作用是用来实现函数调用。
// 打印最大值
var maxNumber=function() {
var max=arguments[0];
for (var i=1;i<arguments.length;i++){
if (max<arguments[i]){
max=arguments[i];
}
}
return max;
}
console.log(maxNumber(1,2,3,4));
函数对象的实例函数介绍:
toString():返回当前函数的字符串的表现形式
call():将当前函数借给其他对象使用。
语法:函数对象.call(借用者对象)
apply():作用与call相同。
bind():利用当前函数,帮其他函数生成新的函数。
//自定义两个对象,将其中的一个对象的方法借给另外一个对象使用。
var obj={
name:'Frank',
study:function() {
console.log(this.name+'做笔记');
}
}
var obj1={
name:'Mike',
}
obj.study.call(obj1);
obj.study();
函数递归调用:
1.概念:函数自身直接或间接地调用自己的过程。
使用递归解决问题的特点:
(1)问题可以分解为若干个子问题。
(2)子问题的解决方案和问题本身的解决方案一致。
(3)最终问题的解决要依赖于子问题的解决。
(4)最终必须有一个子问题不能再拆分子问题,必须可以直接解决。
2.递归调用的优缺点:
优点:代码实现相对简单。
缺点:消耗栈内存。效率相对较低。
// 1.用递归调用求n的阶层
function stratum(n) {
if (n===1 || n===0)
return 1;
return n*stratum(n-1);
}
console.log(stratum(5));
// 2.使用递归调用求1-n的累加和
function sum(n) {
if (n===1)
return 1;
return n+sum(n-1);
}
console.log(sum(2));
//3.使用递归调用求斐波那契数列中第n个数的值
function fibo(n) {
if (n===1 || n===2)
return 1;
return fibo(n-1)+fibo(n-2);
}
for (var i = 1; i <=20 ; i++) {
console.log(fibo(i)+';');
}
console.log(fibo(5));
使用argument.callee属性实现递归调用。解决安全隐患。
在代码严格模式下不允许使用。
如何启用js代码的严格模式
1.在全局启用,在script中添加“use strict”。
2、在函数内启用,在函数中添加“use strict”。
通常不建议使用argument.callee
“use strict”
function fibo(n) {
if (n===1 || n===2)
return 1;
return arguments.callee(n-1)+arguments.callee(n-2);
}