javascript变量作用域
ringa_lee
ringa_lee 2017-04-10 15:32:54
[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 第三种却可以调用?

ringa_lee
ringa_lee

ringa_lee

全部回复(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

ringa_lee

这个说的很详细了:http://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25c...

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号