javaScript中的函数
- 如果你熟悉了一门其他流行语言,再来使用 JavaScript,那么JavaScript中的函数可能会给你造成一些误解,在JavaScript中,你可以将一个函数赋值给一个变量,还可以将函数作为一个参数传递给另外一个函数,甚至可以使得一个函数返回另外一个函数,这在一些主流语言中都很难实现。JavaScript 中的函数非常灵活,其根本原因在于JavaScript中的函数就是一种特殊的对象,把JavaScript中的函数称为一等公民(First Class Function),因为函数是javaScript中一等公民,使得JavaScript非常容易实现一些特性,比如闭包,还有函数式编程等
函数的本质
函数作为一个对象,可以被赋值、作为参数,还可以作为返回值的,那么如果一个函数返回了另外一个函数,那么就应该返回该函数所有相关的内容。
函数声明及函数表达式
- 函数涉及到了很多底层概念,比如表达式、语句、函数即对象(在JavaScriptgit中)等,而且函数表达式和函数声明看起来类似,都是定义一个函数,然后再调用该函数,很容易把二者搞混淆了。
引用大佬的教学文档
函数声明与函数表达式的差异
首先看以下代码
foo()
function foo(){
console.log('foo')
}
foo函数正确执行
foo()
var foo = function (){
console.log('foo')
}
报错
- 其主要原因是这两种定义函数的方式具有不同语义,不同的语义触发了不同的行为。
第一种称之为函数声明,第二种称之为函数表达式。 - 我们在一个表达式中使用 function 来定义一个函数,那么就把该函数称为函数表达式。
bar = 5
把5改成一个函数定义,就变成函数表达式
bar = function () {
console.log(bar)
}
函数表达式与函数声明的最主要区别
- 函数表达式是在表达式语句中使用 function 的,最典型的表达式是“a=b”这种形式,因为函数也是一个对象,我们把“a = function (){}”这种方式称为函数表达式
- 在函数表达式中,可以省略函数名称,从而创建匿名函数
- 一个函数表达式可以被用作一个即时调用的函数表达式
这里我们定义来一个函数foo,给foo函数设置来name,age属性
function foo() {
var sum = 15
}
foo.name = 24
foo.age = 26
console.log(foo.name)
一个函数可以通过函数名加小括号调用
function bar() {
var text = 10
console.log(text)
}
bar()
除了以用函数名加小括号调用,还可以直接调用一个匿名函数(也可以叫自执行函数)
(function () {
var item = 12
console.log(item)
})()
还可以用apply,call调用函数
call
function myFunction (name){
return name + 1
}
var sum = myFunction.call(this,(2))
console.log(sum)
apply
function myFunction (name){
return name + 1
}
var sum = myFunction.apply(this,[2])
console.log(sum)
构造函数
function myFunction(){
return this.name
}
function Foo(name) {
this.name = name
}
const obj1 = new Foo('xxx')
var ba r = myFunction.apply(obj1)
console.log(bar)
闭包
function foo(){
var number = 1
function bar(){
number++
console.log(number)
}
return bar
}
var mybar = foo()
mybar()
这段代码中在foo函数中定义了一个bar函数,并且bar函数引用了foo函数中的变量number,当调用 foo函数的时候,它会返回bar函数,这种称为闭包。
- JavaScript中的对象就是由一组一组属性和值组成的集合,既然函数也是对象,那么函数也是由一组组值和属性组成的集合
- 因为函数作为一个对象,是可以被赋值、作为参数,还可以作为返回值的,那么如果一个函数返回了另外一个函数,那么就应该返回该函数所有相关的内容
- 函数之所以成为特殊的对象,这个特殊的地方是函数可以“被调用”,所以一个函数被调用时,它还需要关联相关的执行上下文