引言

函数在js中也是一个对象,所以它也是有着自己的属性和方法的,了解它们能更好的使用函数。

// 各种样子的函数
function foo() {}
function foo(a) {}
function foo(a = 1) { return a }
function foo([a,b]) { return a + b }
function foo(a,...args) {return a}
var foo = function() {};
var foo = function f() {};
() => {}

属性及方法

name length属性

// name函数的名称
foo.name //foo
var f = function foo() {} //foo // length函数的参数长度
// 当参数有默认值是,length会不准确
// 当有默认值的参数是第一时,就不会继续计数了
function foo1(a,b) {}
foo1.length // 2
function foo2(a,b=1) {}
foo2.length // 1
function foo3(a=1,b,c) {}
foo3.length // 0

toString()

参数

arguments对象

arguments是函数的参数对象,是一个类数组对象,可以获取或者修改函数的参数,获取的是传入的参数的信息,不是定义的参数,当在‘严格模式’下不能修改。

function foo(a) {
arguments[0] = 1;
return a;
} foo(5) // 1
foo(2,3,5) // argumetns.length == 3

指定默认值

函数的参数也是可以指定默认的

function foo(a = 1, b = 2) {}

// 默认值也可以是表达式
// 表达式是惰性求值的,也就是用到了才会求
let x = 2;
function foo(a = x + 1) { return a }
foo() // 3
x = 4
foo() // 5

参数解构赋值

rest参数

如函数的参数的个数是不确定的可以使用...变量名参数

function foo(...args) { return args }
foo(1,23,4) // [1,23,4] //可配合使用
function foo(a,...args) {} //不用rest参数实现rest效果
function foo() {
return [].slice.call(arguments).sort();
}

:rest参数只能是最后一个参数,否则报错

箭头函数

箭头函数让函数写起来更加的高效,优雅,但是也是有些要注意的地方。

// 没有参数需要小括号()
() => {} // 一个参数可以省略小括号()
a => { retrun a } // 函数语句只有一条是可以省略大括号,也是会自动的return
a => a
// 如果加了大括号,需要返回就应手动return,否则会return一undefined
// 原因,大括号被解释为代码块,而不是函数的语句,函数就没有return
a => { return a }
a => { a } // undefined
a => { id:1, age:12 } //报错SyntaxError
a => ({ id:1, age:12 }) //{ id:1, age:12 }
a => { return { id:1, age:12 } } //{ id:1, age:12 }
// 不return可以写
a => void doesNotReturn()

注:

  1. 箭头函数的this指向的是定义所在的对象,而不是使用所在的对象,所以需要使用this需要慎重。this指向的固定化,并不是因为箭头函数内部有绑定this的机制,实际原因是箭头函数根本没有自己的this,导致内部的this就是外层代码块的this。正是因为它没有this,所以也就不能用作构造函数。
  2. 箭头函数没有arguments对象。
  3. 箭头函数不能用作当构造函数,所以new箭头函数会报错。
  4. 不能使用yield命令。

尾调用优化

函数在调用是会生成调用记录(调用帧),在有尾调用时,会为当前函数之前添加尾调用函数的调用帧。如果函数嵌套调用且都是尾调用,就会有连续的调用帧,由于尾调中的用不依赖外层的内容,所以,尾调用优化就会在调用时保留内层调用帧。如此将能节省调用时间和内存。

function foo() {
let a = 2;
let b = 4;
return g(a + b);
}
f(); // 等同于
function f() {
return g(6);
}
f(); // 等同于
g(6);

JavaScript函数属性,方法,ES6拓展内容总结(箭头函数使用,rest参数)的更多相关文章

  1. ES6入门五:箭头函数、函数与ES6新语法

    箭头函数的基本用法与特点 函数与ES6新语法 一.箭头函数的基本用法与特点 声明箭头函数采用声明变量和常量的关键字:var.let.const 箭头函数的参数:没有参数用"()"空 ...

  2. 石川es6课程---4、箭头函数

    石川es6课程---4.箭头函数 一.总结 一句话总结: 相当于函数的简写,类似python lambda 函数,先了解即可 let show1 = function () { console.log ...

  3. ES6新增语法和内置对象(let,const, Array/String/Set 扩展方法(解构赋值,箭头函数,剩余参数))

    1.let ES6中新增的用于声明变量的关键字. let 声明的变量只在所处于的块级有效. 注意:使用 let 关键字声明的变量才具有块级作用域,var 关键字是不具备这个特点的. 1. 防止循环变量 ...

  4. JavaScript ES6 Arrow Functions(箭头函数)

    1. 介绍 第一眼看到ES6新增加的 arrow function 时,感觉非常像 lambda 表达式. 那么arrow function是干什么的呢?可以看作为匿名函数的简写方式. 如: var ...

  5. ES6系列_7之箭头函数和扩展

    1.默认值 在ES6中给我们增加了默认值的操作相关代码如下: function add(a,b=1){ return a+b; } console.log(add(1)); 可以看到现在只需要传递一个 ...

  6. es6新特性之箭头函数

    <script> { // es3,es5 var evens = [1, 2, 3, 4, 5]; var odds = evens.map(function (v) { return ...

  7. ES6新特性之箭头函数与function的区别

    写法不同 // function的写法 function fn(a, b){ return a+b; } // 箭头函数的写法 let foo = (a, b) =>{ return a + b ...

  8. 【面试题】ES6语法五之箭头函数

    ES6特性=>. function foo(x, y){ return x + y } var foo = (x, y) => x + y 包括一个参数列表(零个或多个参数,如果参数不是一 ...

  9. ES6必知,箭头函数与普通函数的区别。

    1. 箭头函数没有prototype(原型),所以箭头函数本身没有this let a = () =>{}; console.log(a.prototype); // undefined 2. ...

  10. 巧用javascript对象属性,向事件绑定的匿名函数内传递循环控制变量的值

    遇到一个需要向匿名函数传递循环控制变量的问题,我受到园子里这篇文章的启发[笔记]js获取当前点击元素的索引,解决了这个问题.现在把代码贴出来,以防止自己忘记. if ($('#labModal').l ...

随机推荐

  1. PHP 数据库表单创建方法记录(储存三方接口数据必用)

    最近项目在对接第三方接口数据,这里分享下我用来偷懒的一个PHP方法: /** * 数据库表单创建方法 * @return string * @throws \Exception */ public f ...

  2. JS服务端技术—Node.js知识点

    [版权声明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://www.cnblogs.com/cnb-yuchen/p/18031964 出自[进步*于辰的博客] 目录 1.NP ...

  3. QT之数据显示

    引言 目前,为了提高数据校对的效率,使用合理的显示工具完成具体的数据处理,可以加速设计中调试的速度,这也是自行设计上位机的意义所在.数据处理在LabVIEW中是比较简单的,直接调用即可.在QT中可能需 ...

  4. KingbaseES V8R6数据库运维案例之---索引坏块故障处理

    案例说明: 在执行表数据查询时,出现下图所示错误,索引故障导致表无法访问,后重建索引问题解决.本案例复现了此类故障解决过程. 适用版本: KingbaseES V8R3/R6 一.创建测试环境 # 表 ...

  5. CI和自动化测试的结合(jenkins的搭建和使用)

    CI持续集成是一种思想,具体实现是通过jenkins持续集成工具去实现的. Jenkins的安装和配置(war包启动) 安装jenkins的方式有两种: 方式一:通过下载安装包安装,jenkins.m ...

  6. Scala 模式匹配拓展

    1 package chapter08 2 3 object Test03_MatchTupleExtend { 4 def main(args: Array[String]): Unit = { 5 ...

  7. AtCoder Regular Contest 115(without F)

    ARC115 A - Two Choices 题目传送门 分析 可以发现正确答案数量相同当且仅当 \(S_i\) xor \(S_j\) 所含有的 1 的数量为偶数. 再将这个简化一下,正确答案相同当 ...

  8. #主席树#CF813E Army Creation

    题目 \(n\) 个数 \(a_i\) , \(k\) 为给定值, \(q\) 次询问. 每次问 \([l,r]\) 内最多可以选多少个数, 满足同一个数的出现次数不超过 \(k\) 不带修,强制在线 ...

  9. java中的内部类内部接口详解

    目录 简介 内部类 静态内部类 非静态内部类 静态方法内部类 非静态方法的内部类 匿名类 内部接口 总结 简介 一般来说,我们创建类和接口的时候都是一个类一个文件,一个接口一个文件,但有时候为了方便或 ...

  10. 新零售SaaS架构:客户管理系统架构设计(万字图文总结)

    什么是客户管理系统? 客户管理系统,也称为CRM(Customer Relationship Management),主要目标是建立.发展和维护好客户关系. CRM系统围绕客户全生命周期的管理,吸引和 ...