var foo = (function(){
var x = 0;
return function(){return x++;};
})()
Run Code Online (Sandbox Code Playgroud)
为什么var x = 0表达式只运行一次是我对此最大的误解.
Lee*_*Lee 16
你的代码:
var foo = (function(){
var x = 0;
return function(){return x++;};
})()
Run Code Online (Sandbox Code Playgroud)
相当于这段代码:
function f(){
var x = 0;
return function(){return x++;};
}
var foo = f();
Run Code Online (Sandbox Code Playgroud)
当你像这样分解它时,很容易看到该函数f()只被调用一次.它定义x,然后返回一个新的被定义的函数内的局部范围f.这个新函数通常被称为"匿名函数"(意味着它没有名称)或"闭包".事实上,javascript中的所有函数都是"闭包" - 无论它们是否被命名.术语"闭包"仅仅意味着函数保留对父函数范围中定义的变量的访问 - 即使在父函数退出之后也是如此.
所以现在,foo包含从中返回的新函数(闭包)f.您可以foo()根据需要多次拨打电话- 每次都这样做,x将返回并递增.由于x存在于闭包的父作用域中,因此它的值将在对闭包的多次调用中持续存在.
更重要的是......没有其他的代码现在可以访问x一次f()已退出-这基本上意味着,x现在是封闭的"私有数据".挺整洁的吧?
该变量foo被分配给自执行函数的结果,如下所示:
声明一个名为xinitialized 的变量0.返回一个函数,在调用时,将递增值x.
所以在这一点上,foo引用一个函数.
你调用它的方式是:
foo();
Run Code Online (Sandbox Code Playgroud)
第一次来调用它,则返回值将是0的话1,2...
好了,等一下......,应该不会是1,2,3...?
你是在正确的轨道,但在这种情况下,这是不正确的原因是因为预增量和后增量之间的差异.(++varvs var++).所不同的是,结果预增量是增量后的变量的值,而结果后增量是变量的值之前增加.
这个例子说明了闭包的概念,这实际上意味着内部函数可以访问其周围函数中定义的变量.
| 归档时间: |
|
| 查看次数: |
8741 次 |
| 最近记录: |