2017-01-18 39 views
1

据我所知在函数内声明的变量是局部变量(使用var关键字或不)。 如果是这样,那么为什么这个输出5?当致电func2时,我不应该得到ReferenceError,因为只有func1才知道x在函数内部创建全局变量 - 为什么这会起作用?

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

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

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

_ “的函数内声明的变量” _,你没有做因为你没有使用'let'或'var' –

+0

当用'val'声明时,变量是本地的。否则他们是全球性的。 –

+0

阅读[JavaScript范围](https://toddmotto.com/everything-you-wanted-to-know-about-javascript-scope/)。 –

回答

2

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

声明函数内部变量是局部的,但你没有任何声明的变量。你所拥有的就是所谓的“隐式全球”,它只能在“草率模式”下工作。

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();

+0

所以实际上有一种方法可以在函数内部创建全局变量。谢谢! – onTheFence

+1

@onTheFence是的,这是可能的,但这是一个非常糟糕的主意。这就是为什么它会在严格模式下产生错误。 – JLRishe

2

那是因为你没有把它定义为

function func1(){ 
    var x = 5; 
} 

这意味着,JS会使用全局变量x不存在,但会在运行FUNC1。

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

1
function func1(){ 
    x = 5; 
} 

作为可变未作用域func1与声明等效于

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

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

function func1(){ 
    var x = 5; 
} 
相关问题