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
实际上有三种方式来声明一个函数:
函数声明:函数声明定义了一个命名函数变量,无需变量赋值.函数声明作为独立构造出现,不能嵌套在非函数块中.例如:function innerFunction1 () { };
函数表达式:: Function Expression将函数定义为更大的表达式语法(通常是变量赋值)的一部分.通过函数表达式定义的函数可以命名或匿名:
一个.使用匿名函数 - 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"
Run Code Online (Sandbox Code Playgroud)
更多阅读:
这两个符号在功能上是等价的.
你可以假设:
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)
何时使用哪种符号?
我建议var a = function () {}
仅在重新分配a
稍后的值时使用函数表达式notation().然后,函数表达式向读取器发出信号,该读取器a
将被重新分配并且是有意的.
函数表达式表示法的另一个(次要)参数是像JSLint这样的Lint工具,它可能要求您在使用它们之前声明(不定义!)函数.如果您有具有递归定义的函数,即.a
调用b
和b
调用时a
,不能使用函数声明表示法先声明一个.
编辑笔记:我对命名的匿名函数做了一些修改.当您查看堆栈跟踪时,命名匿名函数会很有用.命名函数将提供更多上下文,以免将其记录为"匿名".
归档时间: |
|
查看次数: |
27722 次 |
最近记录: |