1.10函数

函数参数的扩展

默认参数

function fn(name,age=17){
 console.log(name+","+age);
}

fn("Amy",18);  // Amy,18
fn("Amy","");  // Amy,
fn("Amy");     // Amy,17

注意点:使用函数默认参数时,不允许有同名参数。

// 不报错
function fn(name,name){
 console.log(name);
}
 
// 报错
//SyntaxError: Duplicate parameter name not allowed in this context
function fn(name,name,age=17){
 console.log(name+","+age);
}

只有未传递参数,或者参数为 undefined 时,才会使用默认参数,null 值被认为有效的值传递。

function fn(name,age=17){
    console.log(name+","+age);
}

fn("Amy",null); // Amy,null

 函数参数默认值存在暂时性死区,在函数参数默认值表达式中,还未初始化赋值的参数值无法作为其他参数的默认值。

function f(x,y=x){
    console.log(x,y);
}
f(1);  // 1 1
 
function f(x=y){
    console.log(x);
}
f();  // ReferenceError: y is not defined

不定参数

形如,...变量名,由...加上一个具名参数标识符组成。具名参数只能放在参数组的最后,并且有且只有一个不定参数。

function f(...values){
    console.log(values.length);
}
f(1,2);      //2
f(1,2,3,4);  //4

箭头函数

1、相比普通函数,箭头函数有更加简洁的语法。

var f = v => v;

//等于
var f = function(v){
 return v;
}

f(1);  //1

当箭头函数没有参数或者有多个参数,要用 () 括起来

var f = (a,b) => a+b;
f(6,2);  //8

当箭头函数函数体有多行语句,用 {} 包裹起来,表示代码块,当只有一行语句,并且需要返回结果时,可以省略 {} , 结果会自动返回

var f = (a,b) => {
 let result = a+b;
 return result;
}
f(6,2);  // 8

当箭头函数要返回对象的时候,为了区分于代码块,要用 () 将对象包裹起来

// 报错
var f = (id,name) => {id: id, name: name};
f(6,2);  // SyntaxError: Unexpected token :
 
// 不报错
var f = (id,name) => ({id: id, name: name});
f(6,2);  // {id: 6, name: 2}

2、箭头函数不绑定this,会捕获其所在上下文的this,作为自己的this。

箭头函数的外层如果有普通函数,那么箭头函数的this就是这个外层的普通函数的this

箭头函数的外层如果没有普通函数,那么箭头函数的this就是全局变量

下面所示:外层是普通函数

下面所示:外层不是普通函数

var func = () => {
  // 箭头函数里面没有 this 对象,
  // 此时的 this 是外层的 this 对象,即 Window 
  console.log(this)
}
func(55)  // Window

箭头函数体中的 this 对象,是定义函数时的对象,而不是使用函数时的对象。 

function fn(){
  setTimeout(()=>{
    // 定义时,this 绑定的是 fn 中的 this 对象
    console.log(this.a);
  },0)
}
var a = 20;
// fn 的 this 对象为 {a: 18}
fn.call({a: 18});  // 18

3、注意:箭头函数不绑定arguments,取而代之用rest参数解决,同时没有super和new.target。

箭头函数没有arguments、super、new.target的绑定,这些值由外围最近一层非箭头函数决定。 

var func = () => {    
  console.log(arguments)
}
func(55);  // ReferenceError: arguments is not defined

箭头函数可以通过拓展运算符获取传入的参数。

 

4、注意:使用call,apply,bind并不会改变箭头函数中的this指向

window.name = "window_name";

let f1 = function () {
  return this.name;
};
let f2 = () => this.name;

let obj = { name: "obj_name" };

console.log(f1.call(obj));  //obj_name
console.log(f2.call(obj));  // window_name

console.log(f1.apply(obj)); // obj_name
console.log(f2.apply(obj)); // window_name

console.log(f1.bind(obj)());  // obj_name
console.log(f2.bind(obj)());  // window_name

5、注意:箭头函数是匿名函数,不能作为构造函数,不可以使用new命令,否则后抛出错误。

6、箭头函数没有原型对象prototype这个属性 

由于不可以通过new关键字调用,所以没有构建原型的需求,所以箭头函数没有prototype这个属性。

7. 不能使用yield关键字,不能用作Generator函数

箭头函数适合使用的场景

ES6 之前,JavaScript 的 this 对象一直很令人头大,回调函数,经常看到 var self = this 这样的代码,为了将外部 this 传递到回调函数中,那么有了箭头函数,就不需要这样做了,直接使用 this 就行。

需要维护一个 this 上下文的时候,就可以使用箭头函数

// 回调函数
var Person = {
    'age': 18,
    'sayHello': function () {
      setTimeout(function () {
        console.log(this.age);
      });
    }
};
var age = 20;
Person.sayHello();  // 20
 
var Person1 = {
    'age': 18,
    'sayHello': function () {
      setTimeout(()=>{
        console.log(this.age);
      });
    }
};
var age = 20;
Person1.sayHello();  // 18

不适合使用的场景(两种场景)

1、定义函数的方法,且该方法中包含 this

var Person = {
    'age': 18,
    'sayHello': ()=>{
        console.log(this.age);
      }
};
var age = 20;
Person.sayHello();  // 20
// 此时 this 指向的是全局对象
 
var Person1 = {
    'age': 18,
    'sayHello': function () {
        console.log(this.age);
    }
};
var age = 20;
Person1.sayHello();   // 18
// 此时的 this 指向 Person1 对象

2、需要动态 this 的时候

var button = document.getElementById('userClick');
button.addEventListener('click', () => {
     this.classList.toggle('on');
});

button 的监听函数是箭头函数,所以监听函数里面的 this 指向的是定义的时候外层的 this 对象,即 Window,导致无法操作到被点击的按钮对象。


arguments辨析

arguments对象是所有非箭头函数中都可用的局部变量

如何将arguments对象转换为数组

  1. 通过slice
  2. 通过拓展运算符
  3. 通过Array.from
var args = Array.prototype.slice.call(arguments);
var args = [].slice.call(arguments);


const args = [...arguments];

const args = Array.from(arguments);

 arguments函数如何调用自身函数?

以下是可以正常运行的

function factorial (n) {
    return !(n > 1) ? 1 : factorial(n - 1) * n;
}

[1,2,3,4,5].map(factorial);

但是作为匿名函数则不行 

[1,2,3,4,5].map(function (n) {
    return !(n > 1) ? 1 : /* what goes here? */ (n - 1) * n;
});

解决:arguments.callee

arguments要想调用自身的匿名函数,可以通过arguments.callee来调用。

[1,2,3,4,5].map(function (n) {
    return !(n > 1) ? 1 : arguments.callee(n - 1) * n;
});

 


这一次,彻底搞懂箭头函数_Always--Learning的博客-CSDN博客_箭头函数

内容简介 · · · · · · 《特殊函数概论》较系统地讲述了一些主要的特殊函数,如超几何函数、勒让德函数、合流超几何函数、贝塞耳函数、椭圆函数、椭球谐函数、马丢(Mathieu)函数等。同时也阐明一些在讨论特殊函数时常用的概念和理论,如关于函数的级数展开和无穷乘积展开,渐进展开,线性常微分方程的级数解法和积分解法等,在各章之末还附有习题,习题中包含了一些有用的公式作为《特殊函数概论》正文的补充。 目录 · · · · · · 第一章 函数用无穷级数和无穷乘积展开 1.1 伯努利(Bernoulli)多项式与伯努利数 1.2 欧勒(Euler)多项式与欧勒数 1.3 欧勒一麦克洛临(Euler-Maclaurin)公式 1.4 拉格朗日(Lagrange)展开公式 1.5 半纯函数的有理分式展开,米塔格一累夫勒(Mittag-Leffler)定理 1.6 无穷乘积? 1.7 函数的无穷乘积展开.外氏(Weierstrass)定理 1.8 渐近展开 1.9 拉普拉斯(Laplace)积分的渐近展开.瓦特孙(Watson)引理 1.10 用正交函数组展开 习题 第二章 二阶线性常微分方程 2.1 二阶线性常微分方程的奇点 2.2 方程常点邻域内的解 2.3 方程奇点邻域内的解 2.4 正则解.正则奇点 2.5 夫罗比尼斯(Frobenius)方法 2.6 无穷远点 2.7 傅克斯(Fuchs)型方程 2.8 具有五个正则奇点的傅克斯型方程 2.9 具有三个正则奇点的傅克斯型方程 2.10 非正则奇点.正则形式解 2.11 非正则奇点,常规解和次常规解 2.12 积分解法,基本原理 2.13 拉普拉斯型方程和拉氏变换 2.14 欧勒变换 习题 第三章 伽马函数 3.1 伽马函数的定义 3.2 递推关系 3.3 欧勒无穷乘积公式 3.4 外氏(Weierstrass)无穷乘积 3.5 伽马函数与三角函数的联系 3.6 乘积公式 3.7 围道积分 3.8 欧勒第一类积分.B函数 3.9 双周围道积分 3.10 狄里希累(Dirichlet)积分 3.11 r函数的对数微商 3.12 渐近展开式 3.13 渐近展开式的另一导出法 3.14 里曼(Riemann)函数 3.15 函数函数方程 3.16 s为整数时之值 3.17 厄密(Hermite)公式 3.18 与伽马函数的联系 3.19 函数的欧勒乘积 3.20 函数的里曼积分 3.21 伽马函数的渐近展开的又一导出法 3.22 函数的计算 习题 第四章 超几何函数 4.1 超几何级数和超几何函数 4.2 邻次函数之间的关系 4.3 超几何方程的其他解用超几何函数表示 4.4 指标差为整数时超几何方程的第二解 4.5 超几何函数的积分表示 4.6 超几何函数的巴恩斯(Barnes)积分表示 4.7 F(a,β,γ,1)之值 …… 第五章 勒让德函数 第六章 合流超几何函数 第七章 贝塞耳函数 第八章 外氏椭圆函数 第九章 忒塔函数 第十章 雅氏椭圆函数 第十一章 拉梅函数 第十二章 马丢函数 附录 附录一 三次方程的根 附录二 四次方程的根 附录三 正交曲面坐标系 参考书目 符号 索引 外国人名对照索引 出版后记

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值