美文网首页
6、函数的拓展

6、函数的拓展

作者: Daeeman | 来源:发表于2020-08-19 01:10 被阅读0次

6 函数的拓展

#6.1 参数默认值

// ES6 之前
function f(a, b){
    b = b || 'leo';
    console.log(a, b);
}

// ES6 之后
function f(a, b='leo'){
    console.log(a, b);
}

f('hi');          // hi leo
f('hi', 'jack');  // hi jack
f('hi', '');      // hi leo

注意:

  • 参数变量是默认声明的,不能用letconst再次声明:
function f (a = 1){
    let a = 2; // error
}

  • 使用参数默认值时,参数名不能相同:
function f (a, a, b){ ... };     // 不报错
function f (a, a, b = 1){ ... }; // 报错

与解构赋值默认值结合使用

function f ({a, b=1}){
    console.log(a,b)
};
f({});         // undefined 1
f({a:2});      // 2 1
f({a:2, b:3}); // 2 3
f();           // 报错

function f ({a, b = 1} = {}){
    console.log(a, b)
}
f();  // undefined 1

尾参数定义默认值:
通常在尾参数定义默认值,便于观察参数,并且非尾参数无法省略。

function f (a=1,b){
    return [a, b];
}
f();    // [1, undefined]
f(2);   // [2, undefined]
f(,2);  // 报错

f(undefined, 2);  // [1, 2]

function f (a, b=1, c){
    return [a, b, c];
}
f();        // [undefined, 1, undefined]
f(1);       // [1,1,undefined]
f(1, ,2);   // 报错
f(1,undefined,2); // [1,1,2]

在给参数传递默认值时,传入undefined会触发默认值,传入null不会触发。

function f (a = 1, b = 2){
    console.log(a, b);
}
f(undefined, null); // 1 null

函数的length属性:
length属性将返回,没有指定默认值的参数数量,并且rest参数不计入length属性。

function f1 (a){...};
function f2 (a=1){...};
function f3 (a, b=2){...};
function f4 (...a){...};
function f5 (a,b,...c){...};

f1.length; // 1
f2.length; // 0
f3.length; // 1
f4.length; // 0
f5.length; // 2

#6.2 rest 参数

rest参数形式为(...变量名),其值为一个数组,用于获取函数多余参数。

function f (a, ...b){
    console.log(a, b);
}
f(1,2,3,4); // 1 [2, 3, 4]

注意

  • rest参数只能放在最后一个,否则报错:
function f(a, ...b, c){...}; // 报错 

  • 函数的length属性不包含rest参数。
function f1 (a){...};
function f2 (a,...b){...};
f1(1);   // 1
f2(1,2); // 1

#6.3 name 属性

用于返回该函数的函数名。

function f (){...};
f.name;    // f

const f = function g(){...};
f.name;    // g

#6.4 箭头函数

使用“箭头”(=>)定义函数。
基础使用

// 有1个参数
let f = v => v;
// 等同于
let f = function (v){return v};

// 有多个参数
let f = (v, i) => {return v + i};
// 等同于
let f = function (v, i){return v + i};

// 没参数
let f = () => 1;
// 等同于
let f = function (){return 1};

箭头函数与变量结构结合使用

// 正常函数写法
function f (p) {
    return p.a + ':' + p.b;
}

// 箭头函数写法
let f = ({a, b}) => a + ':' + b;

简化回调函数

// 正常函数写法
[1, 2, 3].map(function (x){
    return x * x;
})

// 箭头函数写法
[1, 2, 3].map(x => x * x);

箭头函数与rest参数结合

let f = (...n) => n;
f(1, 2, 3); // [1, 2, 3]

注意点

  • 1.箭头函数内的this总是指向定义时所在的对象,而不是调用时。
  • 2.箭头函数不能当做构造函数,即不能用new命令,否则报错。
  • 3.箭头函数不存在arguments对象,即不能使用,可以使用rest参数代替。
  • 4.箭头函数不能使用yield命令,即不能用作Generator函数。

不适用场景

  • 1.在定义函数方法,且该方法内部包含this
const obj = {
    a:9,
    b: () => {
        this.a --;
    }
}

上述b如果是普通函数,函数内部的this指向obj,但是如果是箭头函数,则this会指向全局,不是预期结果。

  • 2.需要动态this时。
let b = document.getElementById('myID');
b.addEventListener('click', ()=>{
    this.classList.toggle('on');
})

上诉按钮点击会报错,因为b监听的箭头函数中,this是全局对象,若改成普通函数this就会指向被点击的按钮对象。

#6.5 双冒号运算符

双冒号暂时是一个提案,用于解决一些不适用的场合,取代callapplybind调用。
双冒号运算符(::)的左边是一个对象,右边是一个函数。该运算符会自动将左边的对象,作为上下文环境(即this对象),绑定到右边函数上。

f::b;
// 等同于
b.bind(f);

f::b(...arguments);
// 等同于
b.apply(f, arguments);

若双冒号左边为空,右边是一个对象的方法,则等于将该方法绑定到该对象上。

let f = a::a.b;
// 等同于
let f = ::a.b;

相关文章

  • 6、函数的拓展

    6 函数的拓展 #6.1 参数默认值 注意: 参数变量是默认声明的,不能用let和const再次声明: 使用参数默...

  • 007_ES6知识点总结(04)函数的拓展

    ES6知识点整理 [toc] 04 函数的拓展 04.1 函数参数的默认值 ES6支持函数定义时,直接在参数定义后...

  • ES6异步方法

    一、函数的拓展函数传参与默认值ES6函数的默认值:(x = 6)默认值可以写表达式,表达式在函数执行阶段执行 箭头...

  • es6基础知识3(函数拓展)

    title: es6基础知识3(函数拓展)tags: 参数默认值 剩余参数 箭头函数 categories: 前端...

  • ES6-函数的拓展

    1、形参默认参数 形参默认值 不是赋值,而是惰性传值 在es6中,不能用let或者const声明与形参重复的变量或...

  • Kotlin-那些好用的标准高阶函数

    Kotlin特性总结的第二篇,上一篇我们谈了拓展函数和拓展属性。本篇我们来学习一下高阶函数。 拓展函数是对类的拓展...

  • ES6对函数的拓展

    1、rest参数(形式为“...变量名”),用于获取函数的多余参数,这样就不需要使用arguments对象了。 2...

  • 函数的拓展

    参数的默认值 这样写方便了很多,不用像es5那样 x=x || 9那么费劲多写一行代码了 参数变量是默认声明的,所...

  • 函数的拓展

    1、ES6允许为函数参数设置默认值,即直接卸载参数定义的后面。 2、参数的默认作用域 3、rest参数 ES6引入...

  • es6之函数拓展

    本文目录 1.参数默认值 2.rest参数 3.箭头函数 4.箭头函数的简写技巧 1.参数默认值 默认参数就是当用...

网友评论

      本文标题:6、函数的拓展

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