【问题标题】:scope of variables and functions inside if block in javascriptjavascript中if块内的变量和函数范围
【发布时间】:2021-08-11 05:58:16
【问题描述】:

在 if 块内定义的变量,在 if 块外也可以访问

console.log(name) // undefined

if (true) {
  var name = "harry"
  console.log(name) // harry
}

console.log(name) // harry

我知道了:

if (true) {
  sayHello() // hello
  
  function sayHello() {
    console.log("hello")
  }

  sayHello() // hello
}

sayHello() // hello

这个也是。

但是这里发生了什么?????????????????????????????????

sayHello() // TypeError: sayHello is not a function

if (true) {
  sayHello()

  function sayHello() {
    console.log("hello")
  }

  sayHello()
}

sayHello()

【问题讨论】:

  • 使用 ES6 函数现在是块作用域。 “在 if 块内定义的变量,在 if 块外也可访问”仅对于 var 声明的变量为 true。
  • 看看上面建议的严格模式和非严格模式之间的区别,并了解 var、let 和 const 之间的区别。另外,花一些时间了解提升在 javascript 中的工作原理。

标签: javascript scope hoisting


【解决方案1】:

在块内提升函数声明具有令人困惑的语义。

最后一个代码示例类似如下代码:

var sayHello1;
sayHello1();   

if (true) {
  let sayHello2 = function() {
     console.log("hello");
  }

  sayHello2();

  // assigned to outer variable at the place
  // of function declaration in your code
  sayHello1 = sayHello2;

  sayHello2();
}

sayHello1()

从上面的代码中可以看出,您的代码中实际上有两个变量:一个在块内是let 声明,一个在块外是var 声明。

在块外定义的变量被分配给在代码中实际定义的块内声明的函数。

调用外部sayHello1 变量作为函数之前它被分配块内的函数将引发错误。

相关问题:

  1. Why does block assigned value change global variable?
  2. confused about function declaration in { }
  3. What are the precise semantics of block-level functions in ES6?

【讨论】:

  • 不,函数声明被提升。正如我的回答和我的回答末尾列出的相关问题中所解释的那样,函数声明的提升有点不同。
  • 对不起,我的意思是函数表达式
  • 是的,函数表达式没有被提升。
猜你喜欢
  • 1970-01-01
  • 2021-12-18
  • 2020-07-31
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 2014-01-20
  • 1970-01-01
  • 2012-06-06
相关资源
最近更新 更多