表达式语句不得以 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中的匿名函数的用法及优缺点 匿名函数可以有效的保证在页面上写入Javascript,而不会造成全局变量的污染。 这在给一个不是很熟悉的页面增加Javascript时非常有效,也很优美。 一、什么是匿名函数? 在Javascript定义一个函数一般有如下三种方式: 函数关键字(function)语句: function fnMethodName(x){alert(x)} 函数字面量(Function Literals): var fnMethodName = function(x){alert(x)} Function()构造函数: var fnMethodName = new Function('x','alert(x)') 上面三种方法定义了同一个方法函数fnMethodName, 第1种就是最常用的方法,后两种都是把一个函数复制给变量fnMethodName,而这个函数是没有名字的,即匿名函数。 实际上,相当多的语言都有匿名函数。 二、函数字面量和Function()构造函数的区别 虽然函数字面量是一个匿名函数,但语法允许为其指定任意一个函数名,当写递归函数时可以调用它自己,使用Function()构造函数则不行。function test(){var x
func("test",function(data){
x = data.value
})
alert(x)
}