javascript变量作用域

今天工作中遇到的问题

第一种

foo
var foo = function(){
    console.log("foo");
}

图片描述

第二种

foo
function foo(){
    console.log("foo")
}

图片描述

第三种

foo()
var foo = function(){
    console.log("foo")
}

图片描述

var foo = function(){}和function foo(){}这两者有什么区别?
相同的声明 为什么第一种是undefined 第三种却可以调用?

阅读 4k
5 个回答

1st:

例一中,将一个匿名函数赋值给变量的这种创建函数的方式是使用函数表达式。函数表达式和其他表达式一样,在使用之前必须先赋值。所以在foo在定义之前是undefined。

2nd:

例二中,直接声明了一个函数,直接声明的函数会有一个重要的特征函数声明提升(function declaration hoisting),意味这在执行代码之前会先读取函数声明。所以在函数定义之前使用函数也不会出现未定义的情况。

3rd:

例三中,在通过函数表达式定义的函数之前使用,由于函数表达式的声明不会提升,所以在之前foo还不是一个函数。三个例子连续运行就会出现这样,实际情况是@小_秦答案里的。

参考:《JavaScript 高级程序设计 第3版》第7章 函数表达式。

函数声明 函数表达式 变量提升

var foo=function (){} 声明一个变量,

至于function foo(){}

是先声明一个var foo;

然后 foo=function(){}

主要是函数声明语句和函数定义表达式的区别, 函数声明在javascript解析时会提前到作用域的顶部,所以你可以在function foo() {}之前来调用foo(). 而函数定义表达式var foo = function() {} 不会提前到作用域的顶部。http://segmentfault.com/q/1010000002929432/a-1020000002929617

话说你第三个单独执行的时候是会报错的:Uncaught TypeError: foo is not a function

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题