百科问答小站 logo
百科问答小站 font logo



JavaScript 中,定义函数时用 var foo = function () {} 和 function foo() 有什么区别? 第1页

  

user avatar   svjoke 网友的相关建议: 
      

这个问题其实非常好,最关键的区别在于JavaScript 函数和变量声明的“提前”(hoist)行为。

the Google style guide 建议我们采用方法一。

简单的说 如果我们使用 匿名函数

       var FUNCTION_NAME = function() { /* FUNCTION_BODY */};      

这种方式, 编译后变量声明FUNCTION_NAME 会“被提前”了,但是他的赋值(也就是FUNCTION_BODY)并不会被提前。

也就是,匿名函数只有在被调用时才被初始化。

如果我们使用

       function FUNCTION_NAME ()  { /* FUNCTION_BODY */};      

这种方式, 编译后函数声明和他的赋值都会被提前。

也就是说函数声明过程在整个程序执行之前的预处理就完成了,所以只要处于同一个作用域,就可以访问到,即使在定义之前调用它也可以。


请先看一个例子

       function hereOrThere() { //function statement   return 'here'; }  alert(hereOrThere()); // alerts 'there'  function hereOrThere() {   return 'there'; }      

我们会发现alert(hereOrThere) 语句执行时会alert('there')!这里的行为其实非常出乎意料,主要原因是JavaScript 函数声明的“提前”行为,简而言之,就是Javascript允许我们在变量和函数被声明之前使用它们,而第二个定义覆盖了第一种定义。换句话说,上述代码编译之后相当于

       function hereOrThere() { //function statement   return 'here'; }  function hereOrThere() {//申明前置了,但因为这里的申明和赋值在一起,所以一起前置   return 'there'; }  alert(hereOrThere()); // alerts 'there'      

强烈推荐阅读下面文章,JavaScript 中对变量和函数声明的“提前(hoist)”


再看下面一个例子:


       var hereOrThere = function() { // function expression   return 'here'; };  alert(hereOrThere()); // alerts 'here'  hereOrThere = function() {   return 'there'; };      

这里就是我们期待的behavior,这段程序编译之后相当于:

       var hereOrThere;//申明前置了  hereOrThere = function() { // function expression   return 'here'; };  alert(hereOrThere()); // alerts 'here'  hereOrThere = function() {   return 'there'; };       


参考

Frequently Misunderstood JavaScript Concepts

The Syntax for Defining a Function is Significant




  

相关话题

  react让我怀疑自己没有当程序员的天分怎么破? 
  为什么 Dreamweaver 这类所见即所得的编辑器会生成很多垃圾代码? 
  JavaScript 有必要缓存 for 循环中的 Array.length 吗? 
  为什么前端代码会被设计成允许用户在浏览器中看到,而客户端代码却不能? 
  如何看待 Ant Design 圣诞节彩蛋事件? 
  有多大比例的前端工程师,能在合理的时间内独立开发出一个足以供商业网站使用的文本编辑器? 
  是什么阻碍了代码的重用?问题是否应该只解决一次即可? 
  jQuery为什么还在发布新版本? 
  为什么前端不能一直做?难道要转行?? 
  CSS Grid 布局那么好,为什么至今没有人开发出基于 Grid 布局的前端框架呢? 

前一个讨论
女朋友要求我做绝育怎么办?
下一个讨论
以目前显卡科技发展的速度,什么时候能普及可以完美240HZ+运行4K画质大作的显卡?





© 2025-05-09 - tinynew.org. All Rights Reserved.
© 2025-05-09 - tinynew.org. 保留所有权利