在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"
更多阅读:
这两个符号在功能上是等同的。
你可以假设:
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
调用b
和b
调用a
,你不能通过使用函数声明符号在另一个之前声明一个。
编辑笔记:我已经对命名的匿名函数做了一些修改。 当您查看堆栈跟踪时,命名匿名函数可能很有用。 指定的函数会给出更多的上下文,以免记录为“匿名”。
不同之处在于VAR
函数是在运行时定义的,
而没有VAR的函数()在脚本块的分析时定义。
这是唯一的主要区别..
因此,用户将决定需求的基础,使用哪个以及哪个适合需求。
链接地址: http://www.djcxy.com/p/94945.html