2011-09-12 271 views
1

为什么在下面的示例中打印警告2? var a未知函数n ...Javascript函数范围

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 

    <title>Test Doc</title> 
    <script type="text/javascript"> 
     var a = 1; 
     function f() { 
      var a = 2; 
      function n() { 
       alert(a); 
      } 
      n(); 
     } 
     f(); 
    </script> 
</head> 

<body> 


</body> 
</html> 
+0

*“var a未知函数n ...”*在PHP中就是这种情况。幸运的是,JavaScript不是PHP。 – Tomalak

回答

5

JavaScript函数继承父类的作用域。内部变量映射具有相同名称的父级范围变量。

+0

+1专注和良好的联系。 @ user443946,在该文档中搜索“嵌套函数和闭包”。 –

+0

@Ray谢谢,我已更新链接以更具体。 – alex

0

a被decalred作为全局变量和给定的1 a的值函数f()内部也声明和2给出功能n()的值被声明的功能f()内和称为分配到“内后“a

所以当调用n时,标识符a将从n的范围解析。具有a属性的作用域链上的第一个变量对象是在f中声明的对象,因此将返回其值。