如果我有 -
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?
答案 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语句之外声明两个具有两个不同名称的函数,并有条件地调用其中一个。当一个被触发时,另一个即使已经定义也不会执行,因此没有两个都没有运行的风险(如果你担心的话,会提到)。