JavaScript中函数表达式和函数声明及函数声明与函数表达式的不同

 更新时间:2015年11月15日 15:41:37   投稿:mrr  
这篇文章主要介绍了JavaScript中函数表达式和函数声明及函数声明与函数表达式的不同的相关资料,需要的朋友可以参考下

函数表达式和函数声明

在ECMAScript中,创建函数的最常用的两个方法是函数表达式和函数声明,两者期间的区别是有点晕,因为ECMA规范只明确了一点:函数声明必须带有标示符(Identifier)(就是大家常说的函数名称),而函数表达式则可以省略这个标示符:

  函数声明:

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

  函数表达式:

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

所以,可以看出,如果不声明函数名称,它肯定是表达式,可如果声明了函数名称的话,如何判断是函数声明还是函数表达式呢?ECMAScript是通过上下文来区分的,如果function foo(){}是作为赋值表达式的一部分的话,那它就是一个函数表达式,如果function foo(){}被包含在一个函数体内,或者位于程序的最顶部的话,那它就是一个函数声明。

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

还有一种函数表达式不太常见,就是被括号括住的(function foo(){}),他是表达式的原因是因为括号 ()是一个分组操作符,它的内部只能包含表达式,我们来看几个例子:

  function foo(){} // 函数声明
  (function foo(){}); // 函数表达式:包含在分组操作符内

命名函数表达式

提到命名函数表达式,理所当然,就是它得有名字,前面的例子var bar = function foo(){};就是一个有效的命名函数表达式,但有一点需要记住:这个名字只在新定义的函数作用域内有效,因为规范规定了标示符不能在外围的作用域内有效:

 var f = function foo(){
  return typeof foo; // foo是在内部作用域内有效
 };
 // foo在外部用于是不可见的
 console.log(typeof foo); // "undefined"
 console.log(f()); // "function"
var f = function foo(){
return foo; // foo是在内部作用域内有效
};
// foo在外部用于是不可见的
console.log(typeof foo); // "undefined"
console.log( f()==f); // "function"
console.log(f.name);//foo

既然,这么要求,那命名函数表达式到底有啥用啊?为啥要取名?

正如我们开头所说:给它一个名字就是可以让调试过程更方便,因为在调试的时候,如果在调用栈中的每个项都有自己的名字来描述,那么调试过程就太爽了,感受不一样嘛。

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

Js中的函数声明是指下面的形式:

function functionName(){ 
} 

这样的方式来声明一个函数,而函数表达式则是类似表达式那样来声明一个函数,如:

     var functionName = function(){ 
}

可能很多朋友在看到这两一种写法时会产生疑惑,这两种写法差不多,在应用中貌似也都是可行的,那他们有什么差别呢?

 事实上,js的解析器对函数声明与函数表达式并不是一视同仁地对待的。对于函数声明,js解析器会优先读取,确保在所有代码执行之前声明已经被解析,而函数表达式,如同定义其它基本类型的变量一样,只在执行到某一句时也会对其进行解析,所以在实际中,它们还是会有差异的,具体表现在,当使用函数声明的形式来定义函数时,可将调用语句写在函数声明之前,而后者,这样做的话会报错。

相关文章

  • Nuxt默认模板、默认布局和自定义错误页面的实现

    Nuxt默认模板、默认布局和自定义错误页面的实现

    这篇文章主要介绍了Nuxt默认模板、默认布局和自定义错误页面的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • Bootstrap FileInput实现图片上传功能

    Bootstrap FileInput实现图片上传功能

    这篇文章主要为大家详细介绍了Bootstrap FileInput实现图片上传功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-01-01
  • js实现随机点名功能

    js实现随机点名功能

    这篇文章主要为大家详细介绍了js实现随机点名功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • JavaScript实现矩形块大小任意缩放

    JavaScript实现矩形块大小任意缩放

    这篇文章主要为大家详细介绍了JavaScript实现矩形块大小任意缩放,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-08-08
  • 兼容IE/Firefox/Opera/Safari的检测页面装载完毕的脚本Ext.onReady的实现

    兼容IE/Firefox/Opera/Safari的检测页面装载完毕的脚本Ext.onReady的实现

    其中对于IE的检测很有意思。 以上代码,整理自Extjs的脚本,完全可以代替 Ext.onReady使用。
    2009-07-07
  • JS表格组件BootstrapTable行内编辑解决方案x-editable

    JS表格组件BootstrapTable行内编辑解决方案x-editable

    这篇文章主要介绍了JS组件系列BootstrapTable行内编辑解决方案:x-editable,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • 全屏js头像上传插件源码高清版

    全屏js头像上传插件源码高清版

    这篇文章主要为大家详细介绍了全屏js头像上传插件源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-03-03
  • 微信小程序实战篇之购物车的实现代码示例

    微信小程序实战篇之购物车的实现代码示例

    本篇文章主要介绍了微信小程序实战篇之购物车的实现代码示例,详细的介绍了购物车的功能实现,具有一定的参考价值,有兴趣的可以了解一下
    2017-11-11
  • 使用JavaScript实现轮播图效果完整实例

    使用JavaScript实现轮播图效果完整实例

    我们在各种网页中经常见到轮播图的效果,下面这篇文章主要给大家介绍了关于使用JavaScript实现轮播图效果的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • 防止video视频被下载的处理方法汇总

    防止video视频被下载的处理方法汇总

    这篇文章主要介绍了防止video视频被下载的处理方法汇总,本文给大家介绍了多种方法帮助大家解决防止video视频被下载的问题,补充介绍了解决video标签视频禁止下载方法,感兴趣的朋友一起看看吧
    2024-02-02

最新评论