首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Javascript -子块//变量隐藏中的变量重定位

Javascript -子块//变量隐藏中的变量重定位
EN

Stack Overflow用户
提问于 2018-08-03 06:40:24
回答 3查看 343关注 0票数 0

我正在尝试理解Javascript如何处理当前作用域的子块中let变量的重新声明。

let - JavaScript | MDN says:

let声明的

变量在为其定义的块以及任何包含的子块中都有其作用域。

如果我们尝试这样做,它会像预期的那样正常工作:

代码语言:javascript
复制
function letTest() {
  let x = 1;

  for(var i = 0; i < 1; i++) {
    console.log(x);  // logs - 1
  }
}

另一个例子。现在,我使用for子块为0let变量分配一个新值,并执行for循环。这也和预期的一样。

代码语言:javascript
复制
function letTest() {
  let x = 5;
  console.log(x);  // logs – 5

  for( x = 0; x < 12; x++) {
    console.log(x);  // logs – 0, 1, 2, 3, 4, 5, 6, … 10, 11
  }

  console.log(x);  // logs - 12
}

但是,当我们在x子块中使用关键字let重新声明并为同一变量for分配新值时,会发生什么情况:

代码语言:javascript
复制
function letTest() {
  let x = 5;
  console.log(x);  // logs – 5

  for( let x = 0; x < 12; x++) {
    console.log(x);  // logs – 1, 2, 3, 4, 5, 6, … 10, 11
  }

  console.log(x);  // logs - 5
}

这里是什么机制在起作用,到底发生了什么?

为什么let x = 5的值没有改变,为什么现在有2个同名的let变量?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-08-03 16:05:00

我相信我在这里找到了答案:

Demystifying JavaScript Variable Scope and Hoisting

在JavaScript中,可以在嵌套作用域的多层中指定同名变量。在这种情况下,局部变量优先于全局变量。如果以相同的名称声明局部变量和全局变量,则在函数内使用局部变量时,将优先使用局部变量。这种类型的行为称为遮蔽。简单地说,内部变量遮蔽了外部变量。

这里也是:

https://stackoverflow.com/a/11901489/6375464

在计算机编程中,当某个作用域(决策块、方法或内部类)中声明的变量与外部作用域中声明的变量同名时,就会发生变量隐藏。这个外部变量被认为是被屏蔽的……

票数 0
EN

Stack Overflow用户

发布于 2018-08-03 06:53:44

let语句创建一个块范围变量。

代码语言:javascript
复制
function letTest() {
  let x = 5;
  console.log(x);  // x = 5 (same 'x')

  for(let x = 0; x < 12; x++) {
    console.log(x);  // x = 1, 2, …, 10, 11 (different 'x')
  }

  console.log(x);  // x - 5 (same 'x')
}

var语句创建一个函数作用域变量。

代码语言:javascript
复制
function varTest() {
  var x = 5;
  console.log(x);  // x = 5

  for(var x = 0; x < 12; x++) {
    console.log(x);  // x = 1, 2, …, 10, 11
  }

  console.log(x);  // x = 12 ('x' from the for-loop)
}
票数 1
EN

Stack Overflow用户

发布于 2018-08-03 08:14:48

我删除了我之前的答案,因为我误解了你的问题。

尝试在浏览器中运行以下功能(最好是chrome dev工具):

代码语言:javascript
复制
function letTest() {
   debugger;
   for(var i=0; i<2; i++) {
     //some code here
   }
}

在调试器步骤中,var将显示为'i=undefined‘,即使它最初是在for循环中定义的。这是因为它的作用域是执行上下文,在本例中是函数letTest。由于它在这里可用,因此在for-loop块之后也将可用。

代码语言:javascript
复制
function letTest() {
   debugger;
   for(let i=0; i<2; i++) {
     //some code here
   }
}

在调试器步骤中,i不可用,因为它的作用域是块(以及它的子块),这是for循环。

代码语言:javascript
复制
function letTest() {
   let i=100
   for(i=0; i<2; i++) {
     //some code here
   }
}

因为let在它自己的块和子块(可能是for循环)中可用,所以它的初始值从100更改为0,然后在for循环结束后更改为2。

代码语言:javascript
复制
function letTest() {
   let i=100
   for(let i=0; i<2; i++) {
     //some code here
   }
}

因为你在一个块中重新声明了let,所以这里的'i‘将具有块的作用域,如上面的第二个例子所示。因为它有块作用域,所以在块之外不可用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51663070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档