【JS】匿名函数

JavaScript017

【JS】匿名函数,第1张

本节讲解 3 种原生JS的匿名函数。

匿名函数又叫立即执行函数。

因为是匿名的,所以不能被调用。

因为不能被调用,所以不立即执行的话就没意义了。

因为立即执行,所以在执行完之后就会被销毁。

第一种(常用)

( function(){…} )()

第二种(常用)

( function(){…}() )

第三种(不常用)

~function(){…}()

前两种写法,返回值都是正常的。

第三种写法的返回值会比较奇怪,所以很少用。

第一种写法

在控制台输出 1

第二种写法

在控制台输出 2

第三种写法

在控制台输出 -4

在控制台输出2

假设第三种写法的返回值是未知数 x。

则得到的返回值是:-(x + 1)

JavaScript的函数定义分为函数声明和函数表达式。

表达式语句不得以 function 或者 { 开头:

ExpressionStatement → [lookahead ∉ {{, function}] Expression

”裸写“成function fname() { }的,是函数声明,它不能是匿名的。

var c = 1

function test(x) {

console.log(x)

}

// 调用

test(x)

嵌套定义的函数也可以是函数声明。

// innder、outer都是函数声明,只不过外界无法使用inner函数。。

function outer() {

var x = 1

function inner() {

console.log("Hi")

}

}

函数作为表达式出现、或者作为其他表达式的一部分时才是函数表达式(有点绕。。),此时函数可以是匿名或者有名的。

比如赋值表达式的右边;()和[]里面;!等符号后面;return语句后面;。。

var foo = function() {

...

}

(function foo() {})

[Function bar() {}]

function outer() {

var x = 1

return function inner() {

console.log(x)

}

}

描述不同语法结构的语义时,主要和表达式的求值相关。比如赋值的时候需要对=右边的表达式求值,return的时候需要对return后面的求值。

函数表达式的值可以是一个函数对象,或者对这个函数对象进行调用(也就是执行它)产生的结果。

// =右边表达式的”值“是一个函数对象,赋给t。不发生函数调用

var t = function () {

console.log(3)

}

// =右边表达式,先创建函数对象再调用它。t是5

var t = function (x) {

return x + 2

}(3)

函数声明自身不能“求值”。

对于一个js匿名函数

自调用这个匿名函数

这样解释器会报错

为什么呢? 原因可以看一个普通js函数的调用

这是一个函数声明,如果在这么一个声明后直接加上括号调用,解析器不能理解而会报错:

而a函数申明时候,调用就可以直接加 ()

这里可以看出无论是命名函数还是匿名函数,都是函数申明,而直接对匿名函数加 () 之后,解释器就不能理解而报错了

要自调用匿名函数,就需要把匿名函数声明语句变成一个表达式