JS自调用函数问题(立即执行函数)
Posted weizhichang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS自调用函数问题(立即执行函数)相关的知识,希望对你有一定的参考价值。
第一个问题
function ( ) {
console.log("fun1");
}() 为什么执行不了?
.
“函数使用function关键字来定义,可以使用函数定义表达式或者函数声明语句。两种形式中,函数定义都是从function关键字开始。其后跟随:函数名称标识符(函数名称是函数声明语句必需的部分;对于函数定义表达式来说,这个名字是可选的:如果存在,该名字只存在于函数体中,并指代该函数对象本身)。”—摘自《javascript权威指南》
1、使用function声明的函数,必须要有函数名称,否者会抛出语法错误。上面的代码执行过程中,解析器解析function关键字时,默认该代码是function声明,而不是function表达式,编译器会默认生成一个缺少名字的function,并且抛出一个语法错误。
代码执行结果,如图:
2、那么试一下给function加上名字,看看还会不会报错。
结果依然报错,虽然上面的代码已经没有语法问题,但是问题出在圆括号运算符“( )”,我们来理解一下圆括号运算符“( )”,也称为分组运算符,它有两种用法:如果表达式放在圆括号中,作用是求值;如果跟在函数后面,作用是调用函数。
为什么会这样呢?在一个表达式后面加上圆括号,表示该表达式立即执行;而如果是在一个语句后面加上括号,该括号完全和之前的语句不搭,而只是作为一个分组运算符,用来控制运算中的优先级(小括号里的先运算),所以以上代码等价于:
相当于先声明了一个叫fn的函数,之后进行“( )”内的表达式运算,但是“( )”分组运算符内的表达式不能为空,所以报错。
第二个问题
(function ( ) {
console.log("fun1");
})()
.
(function ( ) {
console.log("fun1");
}())
为什么能执行?
1、在JavaScript里,括号内部不能包含语句,当解析器对代码进行解析的时候,先碰到了(),然后碰到function关键字就会自动将()里面的代码识别为函数表达式而不是函数声明。
2、(function(){})会返回函数对象的引用,最后使用圆括号()调用此函数。
第一个问题
function ( ) {
console.log("fun1");
}() 为什么执行不了?
.
“函数使用function关键字来定义,可以使用函数定义表达式或者函数声明语句。两种形式中,函数定义都是从function关键字开始。其后跟随:函数名称标识符(函数名称是函数声明语句必需的部分;对于函数定义表达式来说,这个名字是可选的:如果存在,该名字只存在于函数体中,并指代该函数对象本身)。”—摘自《JavaScript权威指南》
1、使用function声明的函数,必须要有函数名称,否者会抛出语法错误。上面的代码执行过程中,解析器解析function关键字时,默认该代码是function声明,而不是function表达式,编译器会默认生成一个缺少名字的function,并且抛出一个语法错误。
代码执行结果,如图:
2、那么试一下给function加上名字,看看还会不会报错。
结果依然报错,虽然上面的代码已经没有语法问题,但是问题出在圆括号运算符“( )”,我们来理解一下圆括号运算符“( )”,也称为分组运算符,它有两种用法:如果表达式放在圆括号中,作用是求值;如果跟在函数后面,作用是调用函数。
为什么会这样呢?在一个表达式后面加上圆括号,表示该表达式立即执行;而如果是在一个语句后面加上括号,该括号完全和之前的语句不搭,而只是作为一个分组运算符,用来控制运算中的优先级(小括号里的先运算),所以以上代码等价于:
相当于先声明了一个叫fn的函数,之后进行“( )”内的表达式运算,但是“( )”分组运算符内的表达式不能为空,所以报错。
第二个问题
(function ( ) {
console.log("fun1");
})()
.
(function ( ) {
console.log("fun1");
}())
为什么能执行?
1、在JavaScript里,括号内部不能包含语句,当解析器对代码进行解析的时候,先碰到了(),然后碰到function关键字就会自动将()里面的代码识别为函数表达式而不是函数声明。
2、(function(){})会返回函数对象的引用,最后使用圆括号()调用此函数。
以上是关于JS自调用函数问题(立即执行函数)的主要内容,如果未能解决你的问题,请参考以下文章