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 sum (a, b) { return a + b; } 使用函数表达式定义: var sum = func...
  • qq_25178609
  • qq_25178609
  • 2016年06月14日 09:56
  • 453

javascript中函数声明和函数表达式的区别

1.js中函数表达式的定义 表达式(expression)JavaScript中的一个短语,javascript会将其计算(evaluate)出一个结果。程序中的常量是一个最简单的表达式。变量名也...
  • yisuowushinian
  • yisuowushinian
  • 2015年05月07日 21:41
  • 7613

JS中函数声明与函数表达式的不同

Js中的函数声明是指下面的形式:      function functionName(){ }        这样的方式来声明一个函数,而函数表达式则是类似表达式那样来声明一个函数,如:   ...
  • one_and_only4711
  • one_and_only4711
  • 2011年04月25日 11:31
  • 18326

JS函数声明与函数表达式区别

JS函数声明与函数表达式区别
  • LoenTusi
  • LoenTusi
  • 2017年02月10日 16:10
  • 152

Javascript浅谈之表达式和语句的区别

简介   表达式(expressions)和语句(statements)在javascript非常常见,但是就是这些常见的元素,有时候我们也未必能够正确的领会其要表示的含义和用法。这是因为我们总是对...
  • hp_yangpeng
  • hp_yangpeng
  • 2015年09月22日 12:33
  • 798

JavaScript中的立即执行函数表达式

前言 在使用JavaScript的时候经常会看见类似如下的函数调用方式: (function(){ console.log("test"); })(); 或者 (funct...
  • jackyechina
  • jackyechina
  • 2016年09月21日 09:30
  • 728

函数声明和函数表达式之间的区别

函数表达式是javascript中的一个既强大容易令人困惑的特性           《javascript高级程序设计》 定义函数的方式有两种 //指定函数名的方式 1.functio...
  • xiaoerduo123x
  • xiaoerduo123x
  • 2016年11月21日 23:26
  • 207

js中函数表达式、函数声明和立即执行函数归纳

js中函数表达式、函数声明和立即执行函数归纳函数声明、函数表达式、匿名函数函数声明:function fnName () {…};使用function关键字声明一个函数,再指定一个函数名,叫函数声明。...
  • HiLanner
  • HiLanner
  • 2016年04月23日 15:49
  • 1176

JavaScript中”立即调用的函数表达式“

在学习JavaScript的时候,经常会看到“自动立即执行的函数代码”。 说的通俗点就是:定义一个函数,然后立即调用它。 我们知道调用一个函数的方式是在函数名称后面添加一对圆括号。 例如: var ...
  • zhuyunhe
  • zhuyunhe
  • 2015年05月04日 12:18
  • 1085

js 在定义的时候立即执行的函数表达式(function)写法

(function(){... ...})() or (function(){... ....}())(推荐) 是两种JS 立即执行函数的常见写法。 很可能一开始 大家会像我一样,以为 functio...
  • lx_zheng
  • lx_zheng
  • 2016年11月10日 10:02
  • 1536
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JS函数声明和函数表达式的区别
举报原因:
原因补充:

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