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

Why a variable defined global is undefined?

本文关键字:未定义 变量 为什么 定义 全局      更新时间:2023-09-26

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

为什么mynameundefined而不是字符串"global" ?

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

不能引用在该函数作用域之外定义的外部变量吗?这里有一个全局变量…

我怎么能解决这个问题,所以我没有得到一个undefined从一个全局变量?

你偶然发现了js的一个叫做提升的"特性"

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

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

通过将变量和函数声明移动到函数的顶部来提升变量和函数声明。

由于提升,您的代码被重写为以下内容。

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关键字根据您调用函数的方式改变其绑定。

EDIT:为了完整

如果你想在任何上下文中访问全局变量,而不管函数类型如何,那么就声明一个按照约定永远不会覆盖的全局变量。

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。

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

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

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

下面这个有效,因为在警告的上面你给了它一个值