javascript - 函数的定义使用声明式还是赋值式?
迷茫
迷茫 2017-04-10 12:47:13
[JavaScript讨论组]

这两种情况什么分别什么时候使用?

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(3)
PHP中文网

http://justjavac.com/named-function-expressions-demystified.html

PHP中文网

@justjavac 给出的文章比较详细,不错,值得一阅,看懂之后,能加深理解。

我这里就说说如下三种函数“声明”的差异不同和应用场景。

// 函数声明
function A() {};

// 定义一个匿名函数并赋值给一个变量
var B = function() {};

// 定义一个具名函数并赋值给一个变量
var C = function D() {};

先说A()

A 是一个标准的函数声明语句。这行代码明确地声明了一个名为A的函数。

函数的声明在解释器解释的过程中,是在执行期前。也就是说,你的代码还未执行前,这个函数就已经被声明了。

所以 A 这种方式可以后置声明,例如

A();
function A(){};

这样是不会出错的。

再说B()

B 的整个过程是这样的。首先声明一个变量B(这个是在执行期前),然后定义一个匿名函数表达式,最后B指向这个匿名函数表达式。

这种方式与 A 的区别在于,函数 B 是在执行期定义的。故这种方式去定义一个函数必须前置定义,否则在执行时会报类型错误——TypeError: undefined is not a function

还有就是,他是匿名函数,他是没有函数名的。例如执行以下代码:

// 以下代码在非严格模式下可以执行。严格模式会报错
// 声明 A
function A() {console.log(arguments.callee.name)}
// 执行他
A()  // A; 控制台里面会输出

// 定义 B
var B = function() {console.log(arguments.callee.name)}
// 执行他
B() // ;控制台会输出个空白行

最后一种 C()D()

这种情况我们以 ES5 标准来说,IE 的非标准实现不讨论。

这种情况同 B 很相似。但是函数表达式定义了一个具名函数。也就是说这个函数是有自己的名字的。

但是这个名字却不是绑定在当前作用域下的。故直接调用 D() 会出错,如下

var C = function D() {}
D();
// ReferenceError: D is not defined
// D 未定义。

这个具名函数是为了解决严格模式下自己调用自己的问题的。

var C = function D() {
    if(true) D()
}
C();

这样就解决了前面的严格模式下不能访问 arguments.callee 以递归调用自己的问题了。

总结

知道区别了,我们就能灵活运用来写出优雅的代码。

  • 如果想后置函数的声明,我们就可以用 A;
  • 如果我只是想生成一个匿名函数把他设置为某个对象的属性,那就用 B;
  • 如果 B 满足不了我,我还要递归调用自己,那就用 C/D。
巴扎黑

javascript的编码风格很多种,

对于个人项目, 看你个人喜欢. 喜欢哪种,看哪种顺眼就用哪个.

对于集体项目,并且你们的项目Leader或者你们的公司有规定了脚本的编码规范,那么就按照规范写的做,如果没有制定规范,推荐你跟Leader提个建议, 制定一项大家都遵守的脚本编码风格规范百利无一害. 如果时间实在挤不出来,那么可以小组讨论一下,少数服从多数完事.

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

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