匿名函数又叫立即执行函数。
因为是匿名的,所以不能被调用。
因为不能被调用,所以不立即执行的话就没意义了。
因为立即执行,所以在执行完之后就会被销毁。
第一种(常用)
( function(){…} )()
第二种(常用)
( function(){…}() )
第三种(不常用)
~function(){…}()
前两种写法,返回值都是正常的。
第三种写法的返回值会比较奇怪,所以很少用。
第一种写法
在控制台输出 1
第二种写法
在控制台输出 2
第三种写法
在控制台输出 -4
在控制台输出2
假设第三种写法的返回值是未知数 x。
则得到的返回值是:-(x + 1)
匿名函数在声明时不用带上函数名, 可以把匿名函数当作一个function类型的值来对待声明一个普通的函数 function func() { ... } 可以认为和var func = function() { ... }相同, 但是普通函数会自动把函数名"提到"作用域的最前面, 基本上普通函数和匿名函数就只有这一个区别
function xxx() {
foo()//foo被提到了作用域的最前面, 于是这里可以正常调用foo函数
bar()//这里会报错bar是个undefined
function foo(){}
var bar = function(){}
}
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)
函数声明自身不能“求值”。