Javascript中的作用域是如何工作的?

Javascript中的作用域是如何工作的?,javascript,Javascript,我无法理解Javascript中的作用域是如何工作的。 例如 即使在{}中声明了用户名,它仍然在第二个脚本中解析。这怎么可能呢?在您的示例中,唯一的作用域是全局作用域。不同的脚本块是DOM元素,没有自己的javascript作用域 对于javascript作用域。javascript作用域由函数决定(ECMAScript 6添加了一个let语句,该语句也引入了块作用域)。函数定义或let块中未使用var或function声明的所有内容都在全局范围内。只有一个全局作用域,由所有块共享。do块没有引

我无法理解Javascript中的作用域是如何工作的。
例如


即使在
{}
中声明了
用户名
,它仍然在第二个脚本中解析。这怎么可能呢?

在您的示例中,唯一的作用域是全局作用域。不同的脚本块是DOM元素,没有自己的javascript作用域


对于javascript作用域。

javascript作用域由函数决定(ECMAScript 6添加了一个
let
语句,该语句也引入了块作用域)。函数定义或
let
块中未使用
var
function
声明的所有内容都在全局范围内。只有一个全局作用域,由所有
块共享。
do
块没有引入新的作用域,因此在后面的
文档中可以看到声明的变量。write()

在这种情况下,您将在全局
窗口中创建变量
userName
。将第一个示例加载到浏览器后,打开JavaScript控制台并执行
console.log(窗口)
。您应该会看到
窗口
对象转储到控制台中。打开它,你会发现键“userName”,值为“George”

下次从
document.write
中引用变量
userName
时,您是从全局范围引用它

相反,如果您编写了一个函数,然后从
document.write()
调用它,那么只要您使用
var
关键字将其声明为函数的局部变量,就不会在
窗口中看到它

<html>
  <head>
    <script>
    function foo() {
        var userName = "George";
        return 'Name = ' + userName;
    }
    </script>
  </head>
  <body>
     ......
     <script>
        document.write(foo());
     </script>
  </body>
</html>

函数foo(){
var userName=“George”;
返回'Name='+用户名;
}
......
document.write(foo());

1。javascript中没有块作用域。2. <代码>用户名
在全局对象
窗口中声明。问得好。我承认这不是我最好的答案之一,但我认为它解决了海报的困惑。它可能会被否决,因为你的断言是不正确的。通过使用
var
关键字,可以防止变量位于功能块内的全局范围内
function(){a=1;}
-那里的
a
将在全局范围内
function(){var a=1;}
-这里
a
不在全局范围内。好的,我已经提到了定义局部变量的
var
function
关键字。
<html>  
  <head>  
    <script>  
          do {  
              var userName = "George";   
              //bla  
          } while (someCondition);  
    </script>
  </head>
  <body>  
     ......  
     <script>  
        document.write('Name = ' + userName);  
     </script>  
  </body>   
</html>     
<html>
  <head>
    <script>
    function foo() {
        var userName = "George";
        return 'Name = ' + userName;
    }
    </script>
  </head>
  <body>
     ......
     <script>
        document.write(foo());
     </script>
  </body>
</html>