JavaScript学习和使用之函数声明和函数表达式的区别
函数声明和函数表达式的区别
1.函数表达式的区分
函数声明必须带有标示符(Identifier)(就是大家常说的函数名称),而函数表达式则可以省略这个标示符
函数声明:
function 函数名称 (参数:可选){ 函数体 }
函数表达式:
function 函数名称(可选)(参数:可选){ 函数体 }
所以,可以看出,如果不声明函数名称,它肯定是表达式. 可如果声明了函数名称的话,如何判断是函数声明还是函数表达式呢?ECMAScript是通过上下文来区分的,如果function foo(){}是作为表达式的一部分的话,那它就是一个函数表达式,如果function foo(){}被包含在一个函数体内,或者位于程序的最顶部的话,那它就是一个函数声明。
总结:如何判断是函数表达式:
如果不声明函数名称,肯定是表达式 如果声明了函数名称,通过上下文区分。如果是作为表达式的一部分,那它就是一个函数表达式。
1.1 练习:指出下面每一个function foo(){}分别是函数声明还是函数表达式
function foo(){} var bar = function foo(){}; new function bar(){}; (function(){ function bar(){} })();
2.特殊的函数表达式——()分组操作符
还有一种函数表达式不太常见,就是被括号括住的(function foo(){}),他是表达式的原因是因为括号 ()是一个分组操作符,它的内部只能包含表达式,我们来看几个例子:
function foo(){} // 函数声明 (function foo(){}); // 函数表达式:包含在分组操作符内 try { (var x = 5); // 分组操作符,只能包含表达式而不能包含语句:这里的var就是语句 } catch(err) { // SyntaxError }
2.1 思考:使用eval对JSON进行执行的时候,eval(‘(’ + json +’)’),JSON字符串为什么通常被包含在一个圆括号里?
3.解析过程的不同
解析器会率先读取函数声明,并使其在执行任何代码之前可用(可以访问);至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真正被解释执行。——引自《Script高级程序设计(第三版)》
练习题答案:
练习1.1
function foo(){} // 声明,因为它是程序的一部分 var bar = function foo(){}; // 表达式,因为它是赋值表达式的一部分 new function bar(){}; // 表达式,因为它是new表达式 (function(){ function bar(){} // 声明,因为它是函数体的一部分 })();
“`
练习2.1
在使用eval对JSON进行执行的时候,JSON字符串通常被包含在一个圆括号里:eval(‘(’ + json +
‘)’),这样做的原因就是因为分组操作符,也就是这对括号,会让解析器强制将JSON的花括号解析成表达式而不是代码块。
上一篇: json数据格式化展示出来
推荐阅读
-
JavaScript学习和使用之函数声明和函数表达式的区别
-
JavaScript中各种编码解码函数的区别和注意事项_javascript技巧
-
javascript中函数定义以及声明和表达式区别实例详解
-
javascript构造函数和原型(js构造函数和普通函数的区别)
-
javascript构造函数和原型(js构造函数和普通函数的区别)
-
Javascript 普通函数和构造函数的区别
-
JavaScript学习和使用之函数声明和函数表达式的区别
-
浅析函数声明和函数表达式——函数声明的声明提前
-
jQuery中的read和JavaScript中的onload函数的区别
-
python正则表达式函数match()和search()的区别详解