【问题标题】:why if statement isn't looking for a variable in global scope为什么 if 语句不在全局范围内寻找变量
【发布时间】:2014-10-09 22:19:48
【问题描述】:

我正在尝试理解 JS 中的作用域。这里我有一个示例,它在全局范围内有一个名为 check 的变量。它有一个真实的值,我的意思是 1。然后在一个名为 main 的函数中 @ 987654325@ 但有一个if statement 用于检查是否存在检查变量,然后将另一个值重新分配给检查变量。然后打印出来。如果我使用

if(check){}

它打印未定义。我有一些问题

1. 检查变量是在全局范围内声明的。这意味着它可以在任何地方访问。那么即使IF statement 失败,它也应该打印全局分配的值,即 1 而不是 undefined。为什么它打印 undefined 而不是 1??

2.主函数作用域没有检查变量。如果在主函数作用域内找不到检查,为什么不在全局作用域中查找??

  (function(){
        var check=1;
        function main(){
		    if(check){
               var check=10;
	        }
			document.write(check);
			}
		main();
    })();

【问题讨论】:

  • 因为它在到达全局范围之前发现了一个check变量。
  • 它没有找到支票。它正在打印未定义。
  • 您在执行var check=10 时将其设置为未定义。 :) 我相信答案很快就会解释。这是一个很常见的问题。
  • 你能再具体一点吗???
  • 试试这个以进一步阅读该主题:sitepoint.com/back-to-basics-javascript-hoisting

标签: javascript scoping


【解决方案1】:

JavaScript 只有 函数范围 和称为 hoisting 的东西。函数内的每个变量声明都放在函数的开头。因此,您的代码相当于

var check=1;
function main(){
  var check; // = undefined
  if(check){ // block doesn't create scope
    check=10;
  }
  document.write(check);
}

局部变量check遮蔽了外部变量check

【讨论】:

  • 并且,要修复它,只需删除 var 之前的 var check=10;
  • okey 首先我在 main 中没有检查变量。如果检查等于未定义并且 if 语句在 main 的范围内找到检查。那么它应该将值更改为 10。那么为什么它仍然是未定义??
  • check在执行if条件时未定义,因此if条件失败。
  • 这是一个非常有趣的场景。 if 条件中的 var 使 if 条件为假。 :)
【解决方案2】:

JavaScript 将在链中查找它可以找到的最局部变量。基本上,本地范围胜过全局范围。

这是全局范围的潜在缺陷之一,也是应该避免的原因,因为它会与局部变量发生冲突。

【讨论】:

  • 范围不是陷阱,而是设计使然。如果我们只能访问在本地函数作用域中声明的变量以及传入函数的参数,那么 jQuery 之类的库就不可能存在。
  • 我并不是说没有例外,而是应该谨慎使用。
猜你喜欢
  • 1970-01-01
  • 2016-08-19
  • 1970-01-01
  • 1970-01-01
  • 2021-05-20
  • 1970-01-01
  • 2015-04-07
  • 1970-01-01
相关资源
最近更新 更多