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

Pav*_* S. 59 javascript closures declaration function

在JavaScript中声明本地(内部)函数时,有两个选项:

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

(function() {
    var innerFunction1 = function() { ... };
    innerFunction1();
}());
Run Code Online (Sandbox Code Playgroud)

仅使用function关键字声明,而不指定给变量:

(function() {
    function innerFunction2() { ... };
    innerFunction2();
}());
Run Code Online (Sandbox Code Playgroud)

我可以看到第二个的一个优点:函数可以在调用它的代码下面声明,因此更容易将私有函数与实际执行的代码分开.

哪个更好,为什么

Sel*_*gam 44

实际上有三种方式来声明一个函数:

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

  2. 函数表达式:: Function Expression将函数定义为更大的表达式语法(通常是变量赋值)的一部分.通过函数表达式定义的函数可以命名或匿名:

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

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

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

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

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

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

  1. 单身功能,或
  2. 确定以编程方式使用哪个函数(使用命名函数表达式).

函数声明和函数表达式之间的一些区别是:

  1. 函数表达式允许您在不同的点为同一个变量分配不同的函数.
  2. 函数声明定义的函数可以在函数声明本身之前使用(或者基本上在当前作用域中的任何位置),而函数表达式定义的函数只能在定义它之后使用.

单击此处阅读函数声明与函数表达式与函数构造函数@MDN 的详细比较

注意:通过将函数声明赋值给var,可以很容易地将函数声明转换为函数表达式.

function foo() {}
alert(foo); // alerted string contains function name "foo"
var bar = foo;
alert(bar); // alerted string still contains function name "foo"
Run Code Online (Sandbox Code Playgroud)

更多阅读:

  • 差异1不是真的.即使您使用函数声明,您仍然可以使用后续函数表达式覆盖定义.`function a(){alert("a"); } a = function(){alert("b"); }; 一个(); //给出"b"而不是"a" (2认同)

Hal*_*yon 7

这两个符号在功能上是等价的.

你可以假设:

function a() {}
function b() {}
Run Code Online (Sandbox Code Playgroud)

被解释为:

var a, b;
a = function a() {};
b = function b() {};
Run Code Online (Sandbox Code Playgroud)

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


声明-前使用

function a() { b(); } // using b before it's declared?
function b() {}
Run Code Online (Sandbox Code Playgroud)

变为:

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

重新定义一个函数

function a() { alert("a"); }
a = function b() { alert("b"); }; // that's weird!
Run Code Online (Sandbox Code Playgroud)

变为:

var a;
a = function a() { alert("a"); };
a = function b() { alert("b"); }; // oh, that looks normal
Run Code Online (Sandbox Code Playgroud)

声明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"
Run Code Online (Sandbox Code Playgroud)

Lint工具将会对此有所了解.


何时使用哪种符号?

我建议var a = function () {}仅在重新分配a稍后的值时使用函数表达式notation().然后,函数表达式向读取器发出信号,该读取器a将被重新分配并且是有意的.

函数表达式表示法的另一个(次要)参数是像JSLint这样的Lint工具,它可能要求您在使用它们之前声明(不定义!)函数.如果您有具有递归定义的函数,即.a调用bb调用时a,不能使用函数声明表示法先声明一个.

编辑笔记:我对命名的匿名函数做了一些修改.当您查看堆栈跟踪时,命名匿名函数会很有用.命名函数将提供更多上下文,以免将其记录为"匿名".


归档时间:

查看次数:

27722 次

最近记录:

8 年,8 月 前