美文网首页
定义函数

定义函数

作者: Myxy | 来源:发表于2017-11-03 10:15 被阅读0次

arguments

arguments,它只在函数内部起作用,并且永远指向当前函数的调用者传入的所有参数。arguments类似Array但它不是一个Array:

function foo(x) {
    alert(x); // 10
    for (var i=0; i<arguments.length; i++) {
        alert(arguments[i]); // 10, 20, 30
    }
}
foo(10, 20, 30);

实际上arguments最常用于判断传入参数的个数。你可能会看到这样的写法:

// foo(a[, b], c)
// 接收2~3个参数,b是可选参数,如果只传2个参数,b默认为null:
function foo(a, b, c) {
    if (arguments.length === 2) {
        // 实际拿到的参数是a和b,c为undefined
        c = b; // 把b赋给c
        b = null; // b变为默认值
    }
    // ...
}

要把中间的参数b变为“可选”参数,就只能通过arguments判断,然后重新调整参数并赋值。

  • map里使用arguments会出现错误?
var arr = ['0'];
        
        arr.map(function(x){
            console.log(arguments) //['0',0,['0']]
            console.log(arguments.length) //3
        })

rest参数

由于JavaScript函数允许接收任意个参数,于是我们就不得不用arguments来获取所有参数:

function foo(a, b) {
    var i, rest = [];
    if (arguments.length > 2) {
        for (i = 2; i<arguments.length; i++) {
            rest.push(arguments[i]);
        }
    }
    console.log('a = ' + a);
    console.log('b = ' + b);
    console.log(rest);
}

为了获取除了已定义参数a、b之外的参数,我们不得不用arguments,并且循环要从索引2开始以便排除前两个参数,这种写法很别扭,只是为了获得额外的rest参数,有没有更好的方法?

ES6标准引入了rest参数,上面的函数可以改写为:

function foo(a, b, ...rest) {
    console.log('a = ' + a);
    console.log('b = ' + b);
    console.log(rest);
}

foo(1, 2, 3, 4, 5);
// 结果:
// a = 1
// b = 2
// Array [ 3, 4, 5 ]

foo(1);
// 结果:
// a = 1
// b = undefined
// Array []

rest参数只能写在最后,前面用...标识,从运行结果可知,传入的参数先绑定a、b,多余的参数以数组形式交给变量rest,所以,不再需要arguments我们就获取了全部参数。

如果传入的参数连正常定义的参数都没填满,也不要紧,rest参数会接收一个空数组(注意不是undefined)。

小心你的return语句

前面我们讲到了JavaScript引擎有一个在行末自动添加分号的机制,这可能让你栽到return语句的一个大坑:

function foo() {
    return { name: 'foo' };
}

foo(); // { name: 'foo' }

如果把return语句拆成两行:

function foo() {
    return
        { name: 'foo' };
}

foo(); // undefined

要小心了,由于JavaScript引擎在行末自动添加分号的机制,上面的代码实际上变成了:

function foo() {
    return; // 自动添加了分号,相当于return undefined;
        { name: 'foo' }; // 这行语句已经没法执行到了
}

所以正确的多行写法是:

function foo() {
    return { // 这里不会自动加分号,因为{表示语句尚未结束
        name: 'foo'
    };
}

相关文章

  • 函数

    定义:具有特定功能的代码段 函数可分为:①库函数②自定义函数 函数定义:在 main函数 外面定义 自定义函数还可...

  • Kotlin Function vs Lambda

    函数定义方式: Lambda定义方式: 高阶函数定义: 高阶函数使用:

  • 廖雪峰的JS教程2.1-函数

    函数 函数的定义和调用 定义函数 上述abs()函数的定义如下: function指出这是一个函数定义; abs是...

  • 深入理解JavaScript函数

    JavaScript中的函数 1. 函数的定义 两种定义形式:通过函数定义表达式来定义通过函数声明语句来定义 函数...

  • JS 函数

    函数有三种定义方式 函数声明 函数表达式 函数实例化 区别: 函数声明定义特点:函数定义会被前置;重复定义函数时,...

  • JavaScript 函数

    函数函数定义与调用变量作用域全局变量方法高阶函数闭包箭头函数$generator$ 函数 函数定义与调用 定义函数...

  • JS函数

    1.如何定义一个函数 1.1定义具名函数 1.2定义匿名函数 上面的具名函数去掉函数名就是匿名函数 1.3定义箭头...

  • 菜鸟Python笔记-基础篇05:函数(一)

    一、函数定义和调用 <1>定义函数 定义函数的格式如下: demo: <2>调用函数 定义了函数之后,就相当于有了...

  • 004-函数

    函数介绍 函数概念 函数的定义和调用函数的定义(函数可以重复调用,不能重复定义)语法格式:def 函数名(): ...

  • JavaScript之函数定义

    函数定义的三种方式: 一、 函数声明 函数声明的特点:1)函数定义会被前置;2)重复定义函数时,最后一次函数定义有...

网友评论

      本文标题:定义函数

      本文链接:https://www.haomeiwen.com/subject/oknzpxtx.html