繁体   English   中英

全局JavaScript变量范围:为什么这不起作用?

[英]Global JavaScript Variable Scope: Why doesn't this work?

所以我正在玩JavaScript并遇到了我认为奇怪的事情。 有人能够解释以下内容吗? (我已将警报值包含在评论中)

为什么foo()内的第一个警报(msg)返回undefined而不是外部

var msg = 'outside';

function foo() {
  alert(msg); // undefined

  var msg = 'inside';
  alert(msg); // inside
}

foo();    
alert(msg); // outside

考虑到这些都很好:

var msg = 'outside';

function foo() {
  alert(msg); // outside
}

alert(msg); // outside

和:

var msg = 'outside';

function foo() {
  var msg = 'inside';
  alert(msg); // inside
}

alert(msg); // outside

你的第一个例子中发生的事情是msg的声明和初始化被拆分,声明被提升到闭包的顶部。

var msg; //declaration
msg = "inside" //initialization

因此,您编写的代码与之相同

var msg = 'outside';

function foo() {
var msg;  
alert(msg); // undefined
msg = 'inside';
alert(msg); // inside
}

第二个例子不一样。 在第二个示例中,您尚未声明本地变量msg,因此alert(msg)引用全局消息。 这里有一些进一步的阅读: 吊装

Javascript闭包中的变量声明首先发生,无论它们在闭包内的位置如何。 因此,在您的第一个示例中,函数开头存在局部变量msg (因为它在函数内声明),但是在第一个alert之后才会为其分配值,因此对于第一个警报, msg未定义。

你的第一个例子相当于:

var msg = 'outside';

function foo() {
  var msg;
  alert(msg); // undefined

  msg = 'inside';
  alert(msg); // inside
}

alert(msg); // outside

在第二个示例中,您没有在函数中显式声明msg 由于已存在具有相同名称的全局变量,因此使用全局变量而不是定义的本地变量。

在第三个示例中,您显式声明了变量并在尝试使用它之前为其赋值,因此当您发出alert(msg)时,会alert(msg)本地定义的变量。

来自http://www.irt.org/script/1321.htm

如果我们在一个函数内声明但不是一个带有var关键字的变量,它应该是本地的范围,但是在整个函数中是undefined ,直到它被[初始化] ...

这对你有用:

var msg = 'outside';

function foo() {
  alert(window.msg); // outside

  var msg = 'inside';
  alert(msg); // inside
}

alert(msg); // outside
foo();
alert(msg); // still "outside"

您可以完全控制 java脚本函数 的执行并将变量作为参数传递,

在这种情况下,函数内部无法访问外部变量 但是如果你想使用你传递变量参数来访问函数内的那个值。

var msg = 'outside';

function foo(msg) {
  alert(msg); // outside

  var msg = 'inside';
  alert(msg); // inside
}

foo(msg);    
alert(msg); // outside

检查这个Demo jsFiddle

在另一个变量 g中你定义的是一个'私有'变量(在函数范围内 ),因此它在函数内的 “内部”值警告。 希望这对你有所帮助!

var不是声明。 混淆了许多人是一种混乱。 相反, var范围范围的注释。 将'var'放置在范围内并不重要。

JavaScript中的var是Annotation,而不是Statement

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM