在函数内创建全局变量 - 为什么这样做有效?

Creating global variables inside function - why does this work?

据我所知,在函数内部声明的变量是局部变量(使用或不使用 var 关键字)。 如果是这样那么为什么输出 5?我不应该在调用 func2 时得到 ReferenceError 因为 x 只有 func1 知道吗?

<script>
    function func1(){
       x = 5;
    }

    function func2(){
       document.write(x);
    }

    func1();
    func2();
</script>

因为你没有定义为

function func1(){
   var x = 5;
}

这意味着JS将使用不存在的全局变量x,但是当你运行 func1.

"var"的添加定义了func1局部范围内的变量。

function func1(){
   x = 5;
}

等同于

var x; // In global scope
function func1(){
   x = 5;
}

因为变量没有通过声明限定到 func1

如果是这种情况,那么您会在控制台中遇到错误,因为您正在尝试访问尚未定义的变量。

function func1(){
   var x = 5;
}

Afaik, variables declared inside a function are local variables (using var keyword or not).

函数内声明的变量是局部变量,但您没有声明任何变量。您拥有的是所谓的 "implicit global",它仅适用于 "sloppy mode"。

来自MDN

Assigning a value to an undeclared variable implicitly creates it as a global variable (it becomes a property of the global object) when the assignment is executed.

在严格模式下,您的代码会产生错误:

"use strict";

function func1() {
  x = 5;
}

function func2() {
  document.write(x);
}

func1();
func2();

"use strict";

function func1() {
  window.x = 5;
}

function func2() {
  document.write(x);
}

func1();
func2();