JS函数声明和函数表达式的区别

转载 2016年05月31日 12:00:06

首先,函数声明会在任何表达式被解析和求值之前先行被解析和求值。即使声明位于源代码中的最后一行,它也会先于同一作用域中位于最前面的表达式被求值

那么,使用函数声明的实际规则到底是什么? 

 
  FunctionDeclaration(函数声明)只能出现在Program(程序)或FunctionBody(函数体)内。从句法上讲,它们 不能出现在Block(块)({ ... })中,例如不能出现在 if、while 或 for 语句中。因为 Block(块) 中只能包含Statement(语句), 而不能包含FunctionDeclaration(函数声明)这样的SourceElement(源元素)。
 
  另一方面,仔细看一看产生规则也会发现,唯一可能让Expression(表达式)出现在Block(块)中情形,就是让它作为ExpressionStatement(表达式语句)的一部分。但是,规范明确规定了ExpressionStatement(表达式语句)不能以关键字function开头。而这实际上就是说,FunctionExpression(函数表达式)同样也不能出现在Statement(语句)或Block(块)中(别忘了Block(块)就是由Statement(语句)构成的)。
由于存在上述限制,只要函数出现在块中(像上面例子中那样),实际上就应该将其看作一个语法错误,而不是什么函数声明或表达式。
那么我们应该在什么时候使用函数声明或函数表达式呢?函数声明只能出现在“程序代码”中,意味着只能在其它函数体中或者全局空间;它们的定义不能不能赋值给一个变量或属性,或者作为一个参数传递出现在函数调用中;下面的例子是函数声明的允许的用法,foo(),bar()和local()都是通过函数声明模式声明:
// 全局环境
function foo() {}  
function local() {  
// 局部环境  
    function bar() {}  
        return bar;  
}
  当你在语法上不能使用函数声明的时候,你就可以使用函数表达式。比如:传递一个函数作为参数或者在对象字面量中定义一个函数:
 
// 这是一个匿名函数表达式
callMe(function () {  
 
//传递一个函数作为参数
});  
 
// 这是一个具名函数表达式
callMe(function me() {  
  
// 传递一个函数作为参数,函数名为me
});  
 
// 其他函数表达式
var myobject = {  
    say: function () {  
 
// I am a function expression  
}  
};

相关文章推荐

Js函数字面量和Function()构造函数的区别||匿名函数

一、什么是匿名函数?在Javascript定义一个函数一般有如下三种方式: 函数关键字(function)语句:function fn(x){ alert(x); } 函数字面量(Function L...

JS原型链

关于原型链的个人领悟

javascript对象小探之八——函数声明与定义位置要求

在JS中有两种定义函数的方式, 1、var aaa=function(){...} 2、function aaa(){...}  var 方式定义的函数,不能先调用函数,后声明,只能先声明函数,...

Javascript构造函数

当我们创建一个构造函数的实例的时候,其实这个过程包含了若干个隐藏的步骤,我们知道通过构造函数可以创建对象,那么这个对象是哪里来的,可想而知,由原型链继承关系可以得到,无论如何,new Object()...

js函数声明语句与函数表达式的区别深入理解

《JavaScript权威指南》:“尽管函数声明语句和函数定义表达式包含相同的函数名,但二者仍不同,函数声明语句中的函数名是个变量名,变量名指向函数对象,和通过var声明变量一样,函数定义语句中的函数...

JS函数声明和函数表达式的区别

JS中有两种定义函数的方法:函数声明和函数表达式。 函数声明是指下面的形式: 1. function functionName(){ 2.     // JS Code 3. } 函数表达式则类似...

Js函数声明与函数表达式的区别

在定义函数时,我们一般使用下面这两种方法: 使用函数声明定义:function sum (a, b) { return a + b; } 使用函数表达式定义: var sum = func...

__proto__ 与prototype的区别,js函数声明与创建

var Person = function(name) {     this.name = name; } var p = new Person(); new操作符的操作是 ...

__proto__ 与prototype的区别,js函数声明与创建

http://blog.sina.com.cn/s/blog_877284510101atl9.html var Person = function(name) {     this.name...

js中函数声明和函数表达式的不同

原文连接:http://www.2cto.com/kf/201409/331324.html 记得在面试腾讯实习生的时候,面试官问了我这样一道问题。 //下述两种声明方式有什么不同   f...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)