Javascript的声明美洲杯赔率
分类:计算机教程

var foo;

if(Condition){
    foo = function(){
        //do something
    }
}else{
    foo = function(){
        //do anything else
    }
}

复制代码 代码如下:

if(someVar === undefined){
    someVar = 1;
    alert("someVar未定义");
}

这种情况也是函数表达式,它被包含在一对圆括号中的函数,在其上下文环境中,()构成了一个分组操作符,而分组操作符只能包含表达式,更多的例子:

hello();

function hello(){
    alert("Hello, world!");
}

函数声明解析过程如下:

译注:实际上FunctionDeclaration和FunctionExpression都是函数产生的语法,这和一般编程语言中函数声明只是定义接受参数数量及类型与返回值类型不太相同。或者说,这根本不是字面意义上的函数声明。我们可以理解对于Javascript的函数声明(FunctionDeclaration)其实是声明式(即需要提升的)函数产生语法,而函数表达式(FunctionExpression)则是表达式式(即执行时产生)函数产生语法。

——WhiteSnow

  1. 声明总是在作用域开始时先行解析;
  2. 表达式在遇到时候才运算。

chrome浏览器的诡异现象

下面简单说说函数声明与函数表达式的异同。声明和表达式的行为存在着十分微妙而又十分重要的差别。

1.  如果我们用函数表达式来创建函数,而不是用函数声明来创建,刚开始的题目会如何呢?

function foo(){}; // 声明,因为它是程序的一部分
 
var bar = function foo(){}; // 表达式,因为它是赋值表达(AssignmentExpression)的一部分
 
new function bar(){}; // 表达式,因为它是New表达式(NewExpression)的一部分
 
(function(){
    function bar(){}; // 声明,因为它是函数体(FunctionBody)的一部分
})();

 

  2. 为当前变量对象创建一个名为Identifier的属性,值为Result(1)。

#include "stdio.h"

void main(){
    hello();
}

void hello(){
    printf("Hello, worldn");
}

复制代码 代码如下:

正确写法如下。

函数声明:

函数的两种创建方式

  function Identifier opt( FormalParameterList opt){ FunctionBody }  //这里是具名函数表达式

 

  当你在语法上不能使用函数声明的时候,你就可以使用函数表达式。比如:传递一个函数作为参数或者在对象字面量中定义一个函数:

function(){
    alert(1);
}();

复制代码 代码如下:

再比如对于匿名函数:

具名函数表达式的解析过程如下:

var name = 20;
alert(typeof(name));    //string
name  = 12;
alert(name);    //2012

alert(fn()); //输出Helloworld!  
 
function fn() {
return 'Helloworld!';
}

  • 声明一个函数对象,然后执行它:

    (function(){

    alert(1);
    

    })();

  • 用括号强制执行:

    (function(){

    alert(1);
    

    }());

  • 使用void操作符:

    void function(){

    alert(1);
    

    }();

  (函数表达式分为匿名和具名函数表达式)

Standard ECMA-262 ECMAScript Language Specification  . ECMA . June 2011

function foo(){}; // 函数声明
 
(function foo(){}); // 函数表达式:注意它被包含在分组操作符中
 
try {
(var x = 5); // 分组操作符只能包含表达式,不能包含语句(这里的var就是语句)
}
catch(err) {
// SyntaxError(因为“var x = 5”是一个语句,而不是表达式——对表达式求值必须返回值,但对语句求值则未必返回值。——译
}

 

// 这是一个匿名函数表达式
callMe(function () {
 
//传递一个函数作为参数
});
 
// 这是一个具名函数表达式
callMe(function me() {
 
// 传递一个函数作为参数,函数名为me
});
 
// 其他函数表达式
var myobject = {
    say: function () {
 
// I am a function expression
}
};


  在ECMAScript中,有两个最常用的创建函数对象的方法,即使用函数表达式或者使用函数声明。对此,ECMAScript规范明确了一点,即是,即函数声明 必须始终带有一个标识符(Identifier),也就是我们所说的函数名,而函数表达式则可以省略。

if(someVar === undefined){
    alert("someVar未定义");
}

  

Javascript引擎会先对代码解释,将声明提升,然后再执行。例如为了判断一个变量定义与否,如果我们如此写是会出引用错误的:

复制代码 代码如下:

  • Javascript中声明会被提升;
  • 对于变量显式声明提升的仅仅是声明,赋值并未被提升;
  • 对于函数声明由于其赋值和声明是一体的,所以提升的是整个函数的定义;
  • 变量隐式声明和函数表达式不会被提升。

// 全局环境
function foo() {}
 
function local() {
// 局部环境
    function bar() {}
        return bar;
}

下面Javascript代码为什么能运行?

复制代码 代码如下:

 

// 千万不要这样做!
// 不同浏览器会有不同返回结果,
 
if (true) {
function foo() {
return 'first';
}
}
else {
function foo() {
return 'second';
}
}
foo();
 
 
// 记住,这种情况下要使用函数表达式:
var foo;
if (true) {
foo = function() {
return 'first';
};
}
else {
foo = function() {
return 'second';
};
}
foo();

  • 匿名函数必然是函数表达式
  • 如果有名字的函数作为赋值表达式的一部分那么他也是一个表达式
  • 如果有名字的函数被括号“()”括住,那么他也是一个表达式

  由于存在上述限制,只要函数出现在块中(像上面例子中那样),实际上就应该将其看作一个语法错误,而不是什么函数声明或表达式。

但对于C,这么写会报错:

您可能感兴趣的文章:

函数申明:

function 函数名 (参数可选){ 函数体 }

函数表达式:

function 函数名可选 (参数可选){ 函数体 }

Syntax
FunctionDeclaration :
function Identifier ( FormalParameterListopt ) { FunctionBody }
FunctionExpression :
function Identifieropt ( FormalParameterListopt ) { FunctionBody }

——Standard ECMA-262 ECMAScript Language Specification  . ECMA

学识有限,如有错误,欢迎指正。

我们经常希望匿名函数定义好后立刻执行,但这么写会抛出语法错误:

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

主要为了区分函数的创建是否需要被提升,如果是函数声明就需要被提升创建,但如果是表达式,那么可以在执行时再创建。这样是很必要的,比如我们可以利用表达式动态定义函数:


简单总结,区别在什么地方呢?

Named function expressions demystified . Juriy "kangax" Zaytsev . June 17, 2009

(function foo(){})

hello();

var hello = function(){
    alert("Hello, world!");
}

当初只知道两种声明方式一个是函数声明一个是函数表达式,具体有什么不同没能说得很好。最近正好看到这方面的书籍,就想好好总结一番。

 

函数声明还有另外一个重要的特点,即通过条件语句控制函数声明的行为并未标准化,因此不同环境下可能会得到不同的结果。即是:

本文由美洲杯赔率发布于计算机教程,转载请注明出处:Javascript的声明美洲杯赔率

上一篇:带着项目学PHP第五讲 - ECSHOP系统默认数据库说明 下一篇:没有了
猜你喜欢
热门排行
精彩图文
  • Bootstrap 2.2.2 发布,重要的 Bug 修复版本
    Bootstrap 2.2.2 发布,重要的 Bug 修复版本
    今天我们发布了 Bootstrap 2.2.2, 这是另外一个很大的 bugfix版本,主要是侧重于 CSS 和文档方面的问题修复,也有很小一部分的JS问题,主要包括: Docs: Asset
  • 每天一个linux命令 chgrp命令
    每天一个linux命令 chgrp命令
    [root@localhost test]# ll---xrw-r-- 1 root root 302108 11-13 06:03 log2012.log[root@localhost test]# chgrp -v bin log2012.log“log2012.log” 的所属组已更改为 bin[root@localhost test]# ll---xr
  • 我是如何跨专业零基础学习Python爬虫的(2 爬虫所
    我是如何跨专业零基础学习Python爬虫的(2 爬虫所
    列表是Python中最基本的数据结构,列表是最常用的Python数据类型,列表的数据项不需要具有相同的类型。列表中的每个元素都分配一个数字 2. Python 列表
  • TCP socket如何判断连接断开
    TCP socket如何判断连接断开
    自己做了一个tcp工具,在学习动画的时候踩了坑,需求是根据上线变绿色,离线变灰色,如果连接断开了,则变为灰色 http://blog.csdn.net/zzhongcy/article/detail
  • golang新手们容易犯的3个错误总结
    golang新手们容易犯的3个错误总结
    这是因为golang中变量的作用域范围小到每个词法块(不理解的同学可以简单的当成{}包裹的部分)都是一个单独的作用域,大家都知道每个作用域的内部声