2012-11-21 97 views
5

就像我读过的文章一样多,我仍然有一些问题。Javascript关闭说明?

我已经知道(和理解)关闭的像用法:

  1. 臭名昭著的循环问题(与保持数量与戒备在他们中的每一个环节环)

  2. 增加计数器(继续呼叫功能 - >哪些提醒增加数字)

here

内部函数指的是其外部函数 的局部变量创建封闭

here

的封闭为函数的局部变量 - 在 函数返回之后保持活动状态,或者闭包是一个不是 的分配栈d函数返回时。 (就好象一个 '堆栈帧' 是 malloc分配的而不是在堆栈上!)

3个问题请:

问题#1

有人告诉我,所有的JS中的函数创建闭包。

什么 ???如果我用私有变量创建一个正常的函数,它只是创建一个范围。不关闭。

我觉得这样封闭工作:(from here

  1. 制作外, “功能机” 的功能。
  2. 在其中声明一个局部变量。
  3. 在外部声明一个内部函数。
  4. 在内部函数中使用外部函数的变量。
  5. 有外部函数返回的内部函数
  6. 运行的功能,它的返回值赋值给一个变量

exmample:

function functionMaker(){ 
    var x = 1; 
    function innerFunction(){ 
    alert(x); 
    x++; 
    } 
    return innerFunction; 
} 

那么,为什么他们说每个js函数创建闭包?

问题2

是否Self-Invoking Functions又名IEFA - Immediately Invoked Function Expression创建一个封闭?

看着

(function (a) { 
    alert(a); 
})(4); 

我没有看到像上面的6规则模式: 正是Have the outer function return the inner function是在这里吗?我看不到字return

问题#3

function myFunction() { 
  var myVar = 1; 
  var alertMyVar = function() { 
    alert('My variable has the value ' + myVar); 
  }; 
  setTimeout(alertMyVar, 1000 * 3600 * 24); 
} 
myFunction(); 

是否myFunction还活着,全日在这里?或者在setTimeout之后立即结束?如果是这样,怎么SetTimeOut想起价值?

请帮我得到它的权利。

回答

8

所有功能调用创建一个封闭。重要的是要注意封闭是否超出了函数调用的生命周期。

如果我做了一个立即执行的功能:

var value = (function() { 
    return 4; 
})(); 

然后封闭被创建,但放弃当函数返回。为什么?因为没有对闭包中定义的符号的存活引用。但在这里:

var value = function() { 
    var counter = 0; 
    return function() { 
    return counter++; 
    }; 
}(); 

封闭住在立即执行功能后,因为它返回另一个功能,又包括在原函数中定义的“计数器”符号引用。由于返回的函数仍然“活着”,因此闭包必须由运行时系统保留。

注意这里:

var value = function() { 
    return function(a) { 
    return "hello " + a; 
    }; 
}(); 

即使外立即执行函数返回一个函数,该函数不从外一个引用任何符号,所以没有必要保持关闭。

我猜我想说的是,它有助于思考的封闭物的执行功能,而不是严格的静态,结构的东西效果的一部分。有可能有一个功能,有时创建一个持久闭包,但并不总是。

+0

感谢。它与我的第3个问题有关吗? '在函数调用的生命周期之外? –

+0

记住:JavaScript的IIFEs必须有括号:'(函数(){})();' –

+2

@WaleedKhan不,那是不正确的。只需要消除'function'关键字的歧义。在'='表达式的右边没有歧义,所以括号不是必需的。 – Pointy