在函数内明确地定义变量的范围

时间:2011-09-13 12:32:27

标签: javascript function scope anonymous-function

我正在阅读this文章 还有一段:

  

如果您发现自己需要明确确定变量范围   在函数内部,您可以使用匿名函数来执行此操作。您   实际上可以创建一个匿名函数,然后直接执行它   离开,里面的所有变量都将限定为匿名   功能:

 (function() {
        var myProperty = "hello world";
        alert(myProperty);
  })();
 alert(typeof(myProperty)); // undefined

我已经遇到过这个问题,但仍然需要澄清一下为什么我需要在Javascript中的函数内部隐式定义变量时,需要在函数内显式扩展变量。

你能解释一下这个目的吗?

谢谢

1 个答案:

答案 0 :(得分:3)

for (var i = 0; i < 10; i++) {
  setTimeout(function() { console.log(i) }, 10);
}

// alerts 10, 10 times

for (var i = 0; i < 10; i++) {
  (function(i) {
    // explicitly scope i
    setTimout(function() { console.log(i) }, 10);
  })(i);
}

当在其他函数内部生成函数并通过闭包范围访问作用域链中的变量时,在外部函数中“显式地限定”变量可能是有用的。

虽然这是反模式。正确的解决方案是

var generateLogger = function(i) {
  return function() { console.log(i); };
}

for (var i = 0; i < 10; i++) {
  setTimeout(generateLogger(i), 10);
}

由于在循环中生成函数效率低且操作不好。

没有真正使用“明确确定”变量的用例,而这些变量是通过不在其他函数中创建函数而无法避免的。