【问题标题】:Why is the function visible even outside the scope in which it is defined? [duplicate]为什么该函数即使在定义范围之外也是可见的? [复制]
【发布时间】:2016-06-05 14:21:38
【问题描述】:

如果我有-

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

innerouter 之外不可见

但如果我有这样的东西-

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?

【问题讨论】:

  • foo 的范围不会启动 if 块。除了let,js 没有块作用域,而是基于函数的作用域。除此之外,这不是在 if 块中定义函数的有效语法。
  • 一个函数本身就是一个“作用域”,它里面的所有东西都不会从它里面流出,但是它可以访问函数之外的全局变量。 foo.Prototype.bar = function () {} 可以扩展 foo 函数。您使用的示例始终声明函数,它始终为真或假。
  • JavaScript 不是块作用域,而是函数作用域。 “foo 的范围在下一行的 } 结束”是完全错误的。

标签: javascript


【解决方案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 语句之外声明两个具有两个不同名称的函数,并有条件地调用其中一个。当一个被触发时,即使它已被定义,另一个也不会执行,因此两者都没有运行的风险(如果您担心这一点,请提及)。

【讨论】:

  • if 块内定义函数无效。 (Function declarations inside if/else statements?)。 [...]You're correct that variables inside of functions go out of scope, but the same is not true for if/else statements.[...] 是什么意思?这是非常模棱两可和误导性的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-24
  • 2016-12-14
  • 2014-05-26
  • 2017-02-07
  • 1970-01-01
  • 2020-05-08
  • 1970-01-01
相关资源
最近更新 更多