30

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

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

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

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

以及如何解决此问题,以免undefined从全局变量中获取 a?

4

3 回答 3

64

您刚刚偶然发现了一个称为提升的 js“功能”

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

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

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

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

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。

于 2015-05-26T22:12:26.343 回答
3

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

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

于 2015-05-26T22:12:19.250 回答
0

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

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

于 2015-05-26T22:12:44.797 回答