为什么函数甚至可以在定义它的范围之外看到?

时间:2016-06-05 14:21:38

标签: javascript

如果我有 -

function outer(){
    function inner(){}
}
inner

之外无法看到

outer

但如果我有这样的事情 -

if (true) {                  // the scope for foo starts here
  function foo() {
    return 'first';
  }
// the scope for foo ends  on the } in next line
}
else {
  function foo() {
    return 'second';
  }
}

然后,

typeof foo == function   // true, foo is visible here, Why?

1 个答案:

答案 0 :(得分:1)

因为if / else语句具有它们内部的任何范围(无论是全局还是内部的另一个函数)。一旦你退出if / else逻辑,你就会以某种方式定义foo。

在这种情况下,如果true为真(它是),那么foo将被设置为第一个函数。如果它不是真的,foo仍将被设置为第二个函数。

您要纠正函数内部的变量超出范围,但if / else语句的情况也是如此。

例如:

a = 5;
var add_ten = function(a){
    b = a + 10;
    return b;
}
c = add_ten(a)
console.log(b) // B will not be set

if(a > 1){
    b = a + 10;
}
console.log(b) // B will be set

这是一件好事:您希望以后能够使用这些变量。

编辑:我应该提一下,因为下面的评论详细说明,有条件地宣布功能是一种不好的做法,应该避免。相反,您应该在if / else语句之外声明两个具有两个不同名称的函数,并有条件地调用其中一个。当一个被触发时,另一个即使已经定义也不会执行,因此没有两个都没有运行的风险(如果你担心的话,会提到)。

相关问题