为了账号安全,请及时绑定邮箱和手机立即绑定

var functionName = function(){} vs function

var functionName = function(){} vs function

德玛西亚99 2019-05-20 17:20:59
我最近开始维护其他人的JavaScript代码。我正在修复错误,添加功能,并试图整理代码并使其更加一致。以前的开发人员使用两种声明函数的方法,如果背后有原因,我就无法解决。这两种方式是:var functionOne = function() {    // Some code};function functionTwo() {    // Some code}使用这两种不同方法的原因是什么?每种方法的优缺点是什么?有一种方法可以通过一种方法完成,而另一种方法无法完成吗?
查看完整描述

5 回答

?
噜噜哒

TA贡献1784条经验 获得超7个赞

不同之处在于它functionOne是一个函数表达式,因此只在到达该行时定义,而是functionTwo一个函数声明,并且只要执行其周围的函数或脚本(由于提升)就会定义。

例如,一个函数表达式:

// TypeError: functionOne is not a function

functionOne();


var functionOne = function() {

  console.log("Hello!");

};

并且,一个函数声明:


// Outputs: "Hello!"

functionTwo();


function functionTwo() {

  console.log("Hello!");

}

这也意味着您无法使用函数声明有条件地定义函数:


if (test) {

   // Error or misbehavior

   function functionThree() { doSomething(); }

}

上面的实际定义functionThree与... test的值无关 - 除非use strict有效,否则它只会引发错误。


查看完整回答
反对 回复 2019-05-20
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

说到全局上下文,var语句和FunctionDeclaration最后都将在全局对象上创建一个不可删除的属性,但两者的值都可以被覆盖

两种方式之间的细微差别在于,当变量实例化过程运行时(在实际代码执行之前),所有声明的标识符var都将被初始化undefined,并且FunctionDeclaration自那时起使用的标识符将可用,例如:

 alert(typeof foo); // 'function', it's already available

 alert(typeof bar); // 'undefined'

 function foo () {}

 var bar = function () {};

 alert(typeof bar); // 'function'

分配bar FunctionExpression发生在运行时间。


由a创建的全局属性FunctionDeclaration可以像变量值一样被覆盖而没有任何问题,例如:


 function test () {}

 test = null;

您的两个示例之间的另一个明显区别是第一个函数没有名称,但第二个函数有它,这在调试(即检查调用堆栈)时非常有用。


关于您编辑的第一个示例(foo = function() { alert('hello!'); };),这是一个未声明的作业,我强烈建议您始终使用该var关键字。

使用赋值,如果没有var语句,如果在作用域链中找不到引用的标识符,它将成为全局对象的可删除属性。

此外,未声明的作业ReferenceError严格模式下投入ECMAScript 5 。

必读:


查看完整回答
反对 回复 2019-05-20
?
慕的地8271018

TA贡献1796条经验 获得超4个赞

您在那里发布的两个代码段几乎在所有目的下都会以相同的方式运行。

但是,行为的差异在于使用第一个variant(var functionOne = function() {}),该函数只能在代码中的该点之后调用。

使用第二个variant(function functionTwo()),该函数可用于在声明函数的上方运行的代码。

这是因为对于第一个变体,函数foo在运行时分配给变量。在第二个中,foo在解析时将该函数分配给该标识符。

更多技术信息

JavaScript有三种定义函数的方法。

  1. 您的第一个代码段显示了一个函数表达式。这涉及使用“function”运算符来创建函数 - 该运算符的结果可以存储在任何变量或对象属性中。函数表达式就是这样强大的。函数表达式通常称为“匿名函数”,因为它不必具有名称,

  2. 你的第二个例子是函数声明。这使用“function”语句来创建函数。该函数在分析时可用,并且可以在该范围内的任何位置调用。您以后仍可以将其存储在变量或对象属性中。

  3. 定义函数的第三种方法是“Function()”构造函数,它在原始帖子中没有显示。不建议使用它,因为它的工作方式与eval()存在问题的方式相同。


查看完整回答
反对 回复 2019-05-20
  • 5 回答
  • 0 关注
  • 1213 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信