引言

函数在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. 一键生成项目 SpringBoot+MyBatis代码生成器 支持Oracle MySQL PostgreSQL

    下载地址 https://github.com/lxw112190/lxw_Helper 如果觉得github下载慢的,可以加我QQ(819069052)我发给你,或者加QQ交流群:758616458 ...

  2. 在 kubernetes 环境下如何优雅扩缩容 Pulsar

    背景 在整个大环境的降本增效的熏陶下,我们也不得不做好应对方案. 根据对线上流量.存储以及系统资源的占用,发现我们的 Pulsar 集群有许多的冗余,所以考虑进行缩容从而减少资源浪费,最终也能省一些费 ...

  3. 测试开发之系统篇-Docker容器安装

    前面文章我们讲到,容器是运行在宿主机上的一个进程,多个容器之间使用同一个宿主机上的操作系统内核.此处以Ubuntu20.04系统为例,介绍Docker容器引擎的安装过程. 安装 安装依赖. sudo ...

  4. Supervisor 安装与使用

    一.Supervisor 介绍 Supervisor 是一个用 Python 编写的进程管理工具,它可以用于监控和控制类 UNIX 操作系统上的多个进程.它是一个客户端/服务器系统,其中 Superv ...

  5. #树状数组,线段树,离散#JZOJ 3854 分组

    题目 Bsny所在的精灵社区有\(n\)个居民,每个居民有一定的地位和年龄,\(r_i\)表示第\(i\)个人的地位,\(a_i\)表示第\(i\)个人的年龄. 最近社区里要举行活动,要求几个人分成一 ...

  6. Jetty的server模块

    启用server模块,执行如下命令: java -jar $JETTY_HOME/start.jar --add-modules=server 命令的输出,如下: INFO : server init ...

  7. Maven——阿里云镜像

    <mirror> <id>nexus-aliyun</id> <mirrorOf>*,!jeecg,!jeecg-snapshots</mirro ...

  8. mogdb里xlog相关的几个参数

    openGauss/MogDB 3.0 闪回恢复测试 本文出处:https://www.modb.pro/db/411368 介绍 闪回恢复功能是数据库恢复技术的一环,可以有选择性的撤销一个已提交事务 ...

  9. Windows系统编译libhv带SSL,开启WITH_OPENSSL

    需要开发一个https的服务,使用libhv来做,需要重新编译libhv,需要开启 WITH_OPENSSL,前面编译一直很顺利,但是打开VS生成动态库的时候,报错,找不到ssl相关的文件,看了官方的 ...

  10. 面试官:实战中用过CountDownLatch吗?详细说一说,我:啊这

    写在开头 在很多的面经中都看到过提问 CountDownLatch 的问题,正好我们最近也在梳理学习AQS(抽象队列同步器),而CountDownLatch又是其中典型的代表,我们今天就继续来学一下这 ...