在JavaScript中定义本地函数:使用var还是不使用?

当在JavaScript中声明本地(内部)函数时,有两种选择:

使用var关键字声明,分配给变量:

(function() {
    var innerFunction1 = function() { ... };
    innerFunction1();
}());

function关键字声明,而不分配给变量:

(function() {
    function innerFunction2() { ... };
    innerFunction2();
}());

我可以看到第二个优点:可以在调用它的代码下面声明该函数,以便将私有函数与实际执行的代码分开。

哪个更好为什么


实际上有3种方法来声明一个函数:

  • 函数声明:函数声明定义了一个命名函数变量,而不需要变量赋值。 函数声明作为独立结构出现,不能嵌套在非函数块中。 例如: function innerFunction1 () { };

  • 函数表达式::函数表达式将函数定义为较大表达式语法的一部分(通常是变量赋值)。 通过函数表达式定义的函数可以被命名或匿名:

    一个。 使用匿名函数 - var innerFunction1 = function() { };

    湾 使用命名函数 - var innerFunction1 = function myInnerFunction () { };

  • 函数构造函数:函数构造函数使用Function()构造函数动态地定义一个函数。 请注意函数体作为字符串参数传递给函数。 var innerFunction1 = new Function (arg1, arg2, ... argN, functionBody)

  • 不推荐使用第三种方法,因为将函数体作为字符串传递可能会阻止某些JS引擎优化,并且容易出错。

    函数声明和函数表达式之间的区别很微妙,您应该选择最适合您需求的方法。

    我在需要的地方使用函数表达式

  • 一个单例函数,或者
  • 以编程方式确定使用哪个函数(使用命名的函数表达式)。
  • 函数声明和函数表达式之间的一些区别是:

  • 函数表达式允许您将不同的函数分配给不同点上的相同变量。
  • 函数声明定义的函数可以在函数声明本身之前(或者基本上在当前范围内的任何地方)使用,而函数表达式定义的函数只能在定义点之后使用。
  • 点击此处阅读函数声明与函数表达式与函数构造函数@MDN的详细比较

    注意:通过将函数声明分配给var,函数声明可以很容易地变成函数表达式。

    function foo() {}
    alert(foo); // alerted string contains function name "foo"
    var bar = foo;
    alert(bar); // alerted string still contains function name "foo"
    

    更多阅读:

  • http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html
  • http://javascriptweblog.wordpress.com/2010/07/06/function-declarations-vs-function-expressions/
  • http://msdn.microsoft.com/en-us/library/ie/x844tc74%28v=vs.94%29.aspx
  • http://es5.github.io/#x15.3
  • var functionName = function(){} vs function functionName(){}

  • 这两个符号在功能上是等同的。

    你可以假设:

    function a() {}
    function b() {}
    

    被解释为:

    var a, b;
    a = function a() {};
    b = function b() {};
    

    这就是为什么你不必在使用前声明 - (不定义!)。 您可以在定义它们之后重新分配函数,就像使用变量一样。 函数像变量一样被提升,因为它们是变量(mind = blown?good!)。


    声明-前使用

    function a() { b(); } // using b before it's declared?
    function b() {}
    

    变为:

    var a, b;
    a = function a() { b(); }; // nope! b is declared, we're good
    b = function b() {};
    

    重新定义一个函数

    function a() { alert("a"); }
    a = function b() { alert("b"); }; // that's weird!
    

    变为:

    var a;
    a = function a() { alert("a"); };
    a = function b() { alert("b"); }; // oh, that looks normal
    

    声明vs定义

    声明是: var x 。 用英语:“我将使用变量x ”。

    定义是: x = 5 。 英语中“变量x现在具有值5 ”。

    使用前声明是必需的,并在"use strict"强制执行。 不需要使用之前定义。 如果你的变量是在运行时定义的,那你很好。

    所以var x = 5既是一个声明也是一个定义,就像function a() {}

    命名函数不要覆盖现有变量时要小心:

    var a = function () { alert("a"); };
    var b = function a() { alert("b"); };
    a(); // prints "b"
    

    皮特工具将采取这一点。


    何时使用哪种符号?

    我会建议使用的函数表达式表示法( var a = function () {}仅当您重新分配的值a以后。 然后函数表达式告诉读者a将被重新分配,并且它是有意的。

    函数表达式符号的另一个(次要)参数是像JSLint这样的Lint工具,可能需要您在使用它们之前声明(不定义!)函数。 如果你有一个递归定义的函数,即。 a调用bb调用a ,你不能通过使用函数声明符号在另一个之前声明一个。

    编辑笔记:我已经对命名的匿名函数做了一些修改。 当您查看堆栈跟踪时,命名匿名函数可能很有用。 指定的函数会给出更多的上下文,以免记录为“匿名”。


    不同之处在于VAR函数是在运行时定义的,

    而没有VAR的函数()在脚本块的分析时定义。

    这是唯一的主要区别..

    因此,用户将决定需求的基础,使用哪个以及哪个适合需求。

    链接地址: http://www.djcxy.com/p/94945.html

    上一篇: Define local function in JavaScript: use var or not?

    下一篇: Why do we put '(' before fucntion in JS?