首页 > 其他 > 详细

在变量作用域方面,函数声明和函数表达式有什么区别?

时间:2015-10-25 19:11:06      阅读:516      评论:0      收藏:0      [点我收藏+]

函数声明

 

 

  1. function foo() {}

 

 

  • 函数 foo 将会在整个程序执行前被 hoist (提升),因此它在定义 foo 函数的整个 scope (作用域) 中都是可用的。

  • 即使在函数定义之前调用它也没问题。

 

 

函数表达式

如果没有函数名的话,一定就是函数表达式,但是对于有函数名的情况该如何判断呢?
Javascript 规定如果整个函数体是作为表达式的一部分时,那么它就是函数表达式,否则即是函数声明。

 

 

 

  1. //简而言之,只有下面这样的写法才是函数声明,其他的写法统统都是函数表达式
  2.  
  3. function 函数名(){
  4.     //函数体
  5. }

 

 

匿名函数表达式

 

 

  1. var foo = function() {};
  2. //上面的例子将一个匿名函数赋值给了变量 foo
  3. foo; // ‘undefined‘
  4. foo(); // this raises a TypeErrorvar 
  5. foo = function() {};

 

  • 由于 var 是一个声明所以这里 对变量 foo 进行 hoist (提升),因此当程序执行时,变量 foo 是可调用的。 

  • 但是由于赋值语句只有在运行时才生效,所以变量 foo 的值为 undefined 。

 

命名函数表达式

 

 

  1. var foo = function bar() {
  2.    bar(); // 可以在函数内部调用(实际使用时一定要设置退出条件)
  3.    };
  4. bar(); // ReferenceError

 

 

    • 在这里,命名函数 bar 赋值给了变量 foo ,所以在函数声明外是不可见的,但在 bar 函数内部仍然可以调用。

    • 这是因为 Javascript 对命名函数处理的机制,函数的名称只有在函数内部的作用域中有效。

    •  

在变量作用域方面,函数声明和函数表达式有什么区别?

原文:http://www.cnblogs.com/nullObj/p/4909198.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!