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

时间:2015-05-26 22:05:36

标签: javascript global-variables local-variables hoisting

大家好,我有一个简单的函数和一个全局变量。

  

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

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

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

我如何解决这个问题,所以我从全局变量中得不到undefined

4 个答案:

答案 0 :(得分:35)

你刚刚偶然发现了一个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。

答案 1 :(得分:3)

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

因此局部变量的值在该行之前是未定义的,并且后面有一个值,但是没有人触及全局变量。

答案 2 :(得分:0)

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

它下面的那个可以工作,因为就在你给它一个值的警报之上。

答案 3 :(得分:-3)

你在第一行忘了“var”:

ExportEntry

吊装简单地指的是javascript通过并将所有初始化为变量的变量设置为undefined(不是字符串)