2014-10-09 49 views
0

我想了解JS中的范围。在这里我有一个例子,它在全球范围内有一个名为check的变量。它具有真值,我的意思是1。然后内的函数调用main其中doesn't have a variable called check但具有if statement它检查是否有一个检查变量或没有,在其它重新分配另一个值来检查variable.Then打印它out.if我使用为什么如果语句没有在全球范围内寻找变量

if(check){} 

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

检查变量在全球scope.It声明意味着它可以访问everywhere.Then即使IF statement失败了,它应该打印全局分配的值是1,而不是不确定的为什么打印undefined而不是1?

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

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

+2

因为它在达到全局范围之前找到了一个'check'变量。 – 2014-10-09 22:21:37

+0

它没有找到一个check.it打印未定义。 – 2014-10-09 22:22:38

+0

当您执行'var check = 10'时,您将其设置为undefined。 :)我相信答案很快就会解释。这是一个非常普遍的问题。 – 2014-10-09 22:22:49

回答

4

的JavaScript只有功能范围和一些所谓吊装。函数内部的每个变量声明都放在函数的开头。因此,你的代码就相当于

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

局部变量check阴影外变量check

+0

而且,要解决它,只需在'var check = 10之前删除'var'; ' – 2014-10-09 22:26:23

+0

okey首先我没有在main内部有一个检查变量。如果检查等于未定义,并且如果语句发现检查在main的作用域内。那么它应该将该值更改为10.所以它仍然是未定义的? – 2014-10-09 22:28:00

+1

当if条件执行时'check'未定义,因此if条件失败。 – 2014-10-09 22:28:41

1

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

这是全球范围潜在的陷阱之一,也是为什么它应该避免,因为它与局部变量产生冲突。

+0

范围不是一个陷阱,它是由设计。如果我们只能访问在本地函数范围中声明的变量以及进入函数的参数,那么像jQuery这样的库就不能存在。 – user2867288 2014-10-09 22:34:05

+0

我并不是说没有例外,而应该谨慎使用它。 – TGH 2014-10-09 22:35:11