我只是想用JavaScript写一个方法...

JavaScript中定义一个方法主要能够分红两种形式:javascript

  • 函数声明
  • 函数表达式

函数声明

声明体是最普通的,与其余语言也相近的一种方式。java

function func(a, b) {
  return a + b
}

func(1, 2) // 3
复制代码

不过,毕竟JavaScript!它有一个特性:函数提高。编程

函数提高:把全部函数提高到当前做用域上,从而能够作到“未声明先调用”。函数式编程

(划重点!等下要考!)函数

函数表达式

这多是目前用的最多的声明方式,由于能够搭配箭头函数“伪装本身在用函数式编程”。ui

const func = function(a, b) {
  return a + b
}

// 箭头函数版本
const funcA = (a, b) => a + b

func(1,2) // 3
复制代码

但受变量做用域的关系,因此constlet没有变量提高的能力。this

funcA(1) // ReferenceError: funcA is not defined
const funcA = a => a
复制代码

燃鹅,这才刚刚开始…spa

函数表达式:匿名 & 具名

匿名就是上面那种,而具名就是给函数本体再起一个名字。code

const func = function funcName() {}
复制代码

这样有什么用?后面那个名字又不能用!答案仍是有区别的。对象

首先有一个函数名推断,例如上面这个函数,那么func.name会返回funcName,若是匿名函数的话[fn].name会返回''(在ES5的状况下,ES6会被推断为外面的函数名)。其次这个名字能够在函数内部使用,固然了指代的就是本身了。

const func = function funcName(a, b) {
  return a < 0 ? b : funcName(a+1-b, a)
}

func(431, 151) // 281
funcName(431, 151) // ReferenceError: funcName is not defined
console.log(func.name) // funcName
typeof funcName === 'function' // false
复制代码

因此这种方式最适合递归函数了。

函数表达式依然是个常/变量

关键词已经决定了这个“量”会以什么形式存在,好比varlet是变量,const是常量,而且let还有做用域范围。

const funcA = () => console.log('A')
funcA() // A
funcA = () => console.log('AA') // TypeError: Assignment to constant variable.

var funcB = () => console.log('B')
funcB() // B
funcB = () => console.log('BB')
funcB() // BB
复制代码

题外话:那么就有个老生常谈的问题了,函数表达式按道理来说是“灵活的”,那么

function funcB() {
  console.log('B')
}
funcB()
function funcB() {
  console.log('BB')
}
funcB()
复制代码

两个funcB的结果分别会是什么?

箭头函数

又到了你们最最喜欢的箭头函数环节,如今还有谁是不肯意写箭头函数的?

const func = a => b => a + b
func(1)(2) // 3
复制代码

不过,箭头函数两个特色:

  • 不会创造上下文(自身无this
  • 必然是个匿名函数
  • 没有 arguments

不是两点吗?怎么变成三点了?此时你可能会回去检查刚刚那句话,可是我如今悄悄告诉你,实际上是三点。

关于箭头函数自身无this,有不少文章讲了this的指向相关,能够翻看那些文章获得答案。

计算属性函数名

这个应该是在“对象”的环境中存在,毕竟对象能够指代不少种只要是对象的状况。

const object = {
  ['a' + 'b'](a, b) {
    return a + b
  }
}

object.ab(1, 2) // 3
复制代码

这就实现了“函数名能够暂时不知道是什么”的状况,经过计算来获得这个函数。

Other

new Function

这是一个不知道哪里能够用得上可是能够用的方式:经过对象建立

const func = new Function('a', 'b', 'return a + b')
func(1, 2) // 3
复制代码

函数参数初始值

可能会有参数要初始值的需求,但可能没有

function func(a = 1, b = 2) {
  return a + b
}

func() // 3
复制代码

可能咱们更经常使用的还有这些

const funcA = (obj = {}) => obj

const funcB = (arr = []) => arr
复制代码

JavaScript毕竟是「函数是第一公民」的语言,有机会会写到不少高阶函数。因此

const func = (fn = () => 'YDJFE') => fn.call(null)
复制代码

凭什么函数做为参数就不能有初始值呢?固然是能够的呀!

总结

我只是想用JavaScript写一个方法…为何这么复杂…

(关于JavaScript定义方法,若是还有其余姿式欢迎补充~)

相关文章
相关标签/搜索