【问题标题】:Why a variable defined global is undefined? [duplicate]为什么定义的全局变量未定义? [复制]
【发布时间】:2015-08-08 18:55:58
【问题描述】:

我这里有一个简单的函数和一个全局变量。

为什么是myname undefined 而不是字符串"global"

var myname = "global"; // global variable
function func() {
    alert(myname); // "undefined"
    var myname = "local";
    alert(myname); // "local"
}
func();

不能引用在该函数范围之外定义的外部变量吗?而在这个全局变量中...

我该如何解决这个问题,这样我就不会从全局变量中获得undefined

【问题讨论】:

  • 我猜,你忘记了全局变量上的 'var'
  • 我相信@crc442 是正确的。你能发布你的错误信息来确认吗?
  • @crc442 - 我相信你不知道你在说什么
  • 全局变量上的“var”是可选的,被认为不是好习惯。
  • 哦!我完全忘记了。那是我的调试直觉。对此我很抱歉。

标签: javascript global-variables local-variables hoisting


【解决方案1】:

你刚刚偶然发现了一个叫做提升的 js“功能”

var myname = "global"; // global variable
function func() {
    alert(myname); // "undefined"
    var myname = "local";
    alert(myname); // "local"
}
func();

在此代码中,当您定义 func 时,编译器会查看函数体。它看到您正在声明一个名为 myname 的变量。

Javascript Hoists 变量和函数声明,通过将声明移动到函数顶部。

因为吊装你的代码被改写成如下。

var myname = "global"; // global variable
function func() {
   var myname; //declare local variable and assign it undefined
   alert(myname); // "undefined"
   myname = "local"; // assign local var myname to "local"
   alert(myname); // "local"
}
func();

这“覆盖”了全局变量。如果要访问函数范围内的全局变量,请使用 this 关键字。

var myname = "global"; // global variable
function func() {
    var myname = "local";
    alert(this.myname); // "global"
    alert(myname); // "local"
}
func();

请注意,这仅适用于调用函数而不是方法或构造函数,因为 this 关键字会根据您调用函数的方式更改其绑定的内容。

编辑:为了完整性

如果您想在任何上下文中访问全局变量而不管函数类型如何,请声明一个按照惯例您永远不会覆盖的全局变量。

var global = this; // in global scope.
var myname = "global";
var obj = {f: function () {
    var myname = "local";
    console.log(global.myname);
}};
obj.f(); // "global"

请注意,这是在方法位置,this 关键字直接引用 obj,因此没有定义 myname。

【讨论】:

  • 这是正确答案,我记错了
  • 感谢您的解释。这说得通。我有一个问题。为什么声明与函数第 3 行的赋值分开?
  • @codingpuss 提升不会移动到分配发生的位置。它只复制函数中需要的变量并在顶部声明它们。
  • 如果这是在浏览器中,您可以使用window 变量代替您的global 变量。
  • @Preza8 JS 是在一周内设计的。考虑到这一点,我认为这非常好。
【解决方案2】:

在函数内部,您声明var myname = "local"。即使你是在方法中间做的,那个变量也有函数作用域,所以它属于整个函数,甚至是它上面的代码。

所以局部变量的值在该行之前是未定义的,在之后有一个值,但没有人接触到全局变量。

【讨论】:

  • 我认为您的这部分答案并不准确:“因此,在该行之前,局部变量的值是未定义的……”。 var 语句在 javascript(提升)中移动到顶部,因此它在其分数中的任何其他代码之前执行(在本例中为函数)
  • 作为一个新程序员,无论我阅读了多少这些答案,我都无法弄清楚这个问题的解决方案。问题是我假设每次我想修改一个变量我都必须以var开头(比如var myVariable = 1;var myVariable = myVariable + 3;),而实际上,你应该只在第一次输入var初始化一个变量。在此之后的所有其他时间,您只需以变量名开头并删除var(如var myVariable = 1;myVariable = myVariable + 3;)。 (否则会出现此类问题)
【解决方案3】:

第一个警报未定义的原因是因为您在函数中将global 重新声明为它下方的局部变量。在 javascript 中,这意味着从函数顶部开始,它被视为局部变量。

它下面的那个有效,因为就在你给它一个值的警报上方。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-10
    • 2011-04-28
    相关资源
    最近更新 更多