为什么定义为全局的变量未定义?

Why a variable defined global is undefined?

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

Why is myname undefined and not the string "global"?

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

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

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

在函数内部,您要声明 var myname = "local"。即使您是在方法的中间执行此操作,该变量也具有函数作用域,因此它属于整个函数,甚至是它上面的代码。

所以局部变量的值在该行之前是未定义的,并且在之后有一个值,但是两者都没有触及全局变量。

你刚刚偶然发现了一个叫做 hoisting

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

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

的变量

Javascript Hoists variable and function declarations, by moving the declaration to the top of the function.

因为提升你的代码被重写为以下内容。

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

这个"Covers"全局变量。如果要在函数范围内访问全局变量,请使用 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。

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

它下方的那个有效,因为您在警报上方给了它一个值。