JS面向对象之特殊函数

函数重载

JS 中没有函数不能重载,下一个同名函数总是覆盖上一个同名函数。为了模拟函数的重载只能采用 arguments 对象。

arguments 对象实际上是一个类数组对象,其中存储着该函数传入的所有实参,arguments 中存储数据的格式为:
{ '0': 1, '1': 2, '2': 3, '3': 4 } 其实也是以一个的属性,但是由于属性名的特殊,我们无法使用 . 符号
调用,只能采用 [] 的形式,所以获取值的方式看起来很像一个数组。

arguments 中有 length 属性用来获取实参的长度

如下代码实现了任意参数的加法计算:

function add(){
    var sum = 0;
    for (var i=0; i<arguments.length; i++){
        sum += arguments[i];
    }
    return sum;
}

console.log(add(1,2,4))
console.log(add(1,2,4,3,5,12,53,1,16,3))

结果:

7
100

递归

递归是一个方法自身调用自身的算法,通常一个递归算法都要找到一个递归出口,防止栈溢出。其他语言中的递归写法如下:

var num = 0;
function func(){
    if(num > 9){
        return;
    }
    console.log('this is '+ num);
    num++;
    func();
}

func();

结果:

this is 0
this is 1
this is 2
this is 3
this is 4
this is 5
this is 6
this is 7
this is 8
this is 9

这种写法存在一种缺陷,若将上面程序中的 func 所占内存释放,则调用 f 函数时会抛出一个异常:

var num = 0;
function func(){
    if(num > 9){
        return;
    }
    console.log('this is '+ num);
    num++;
    func();
}

var f = func;
func = null;
f();

倒数第 3 行代码,将 func 的函数体复制给了 f,在调用 f 之前将 func 释放,当 f 函数执行递归时,
找不到 func 函数,就报错了。

解决问题的办法就是使用 arguments.callee() 方法,来代替上面代码中的 func()。可以写成如下形式:

var num = 0;
function func(){
    if(num > 9){
        return;
    }
    console.log('this is '+ num);
    num++;
    arguments.callee();
}

var f = func;
func = null;
f();

匿名函数

匿名函数就是没有名称的函数,但是 JS 语法上并不支持匿名函数(不支持单纯的写为匿名函数),
匿名函数常常用来做 回调函数和自调函数

回调函数

将一个函数作为参数传递给另一个函数,作为参数的函数称为回调函数

不要多层嵌套回调函数,可能会进入回调陷阱

回调函数的写法如下:

function func(){
    console.log('this is func')
}
function f(fun){
    fun()
}
f(func)

一般来说,回调函数的步骤为:

  1. 定义一个回调函数
  2. 定义一个使用回调函数的函数,也就是外部函数
  3. 调用外部函数时写入回调函数的函数名

自调函数

自调函数在定义之后,无需调用可以自己执行。如下代码:

// 无参自调函数
(function () {
    console.log('this is function')
})();

//有参自调函数
(function (arg){
    console.log('hello' + arg)
})('小明');

结果:

this is function
hello小明

自调函数还有一些其他的写法:

(function (arg){
    console.log('hello' + arg)
}('小赵'));

+function (arg){
    console.log('hello' + arg)
}('小张');

!function (arg){
    console.log('hello' + arg)
}('小刘');

~function (arg){
    console.log('hello' + arg)
}('小孙');

作为值的函数

将一个函数写在另一个函数内,并把内部函数返回的函数称为作为值的函数。

作为值的函数有两种返回情况:

  • 返回内部函数的定义
  • 返回内部函数的结果
// 返回内部函数的定义
function fun1(){
    return function f1(){
        return 1;
    }
}
console.log(fun1());

// 返回内部函数的结果
function fun2(){
    function f2(){
        return 2;
    }
    return f2();
}
console.log(fun2())

第一个函数返回了内部函数的定义,第二个函数返回了内部函数的结果:

[Function: f1]
2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值