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

J R*_*Rod 20 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();
Run Code Online (Sandbox Code Playgroud)

是不是可以引用在该函数范围之外定义的外部变量?在这个全局变量......

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

t3d*_*son 42

你刚刚偶然发现了一个名为"吊装"的js"功能"

var myname = "global"; // global variable
function func() {
    alert(myname); // "undefined"
    var myname = "local";
    alert(myname); // "local"
}
func();
Run Code Online (Sandbox Code Playgroud)

在此代码中定义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();
Run Code Online (Sandbox Code Playgroud)

这"涵盖"全局变量.如果要在函数范围内访问全局变量,请使用this关键字.

var myname = "global"; // global variable
function func() {
    var myname = "local";
    alert(this.myname); // "global"
    alert(myname); // "local"
}
func();
Run Code Online (Sandbox Code Playgroud)

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

编辑:为了完整

如果您想要在任何上下文中访问全局变量而不管函数类型如何,那么声明一个按照惯例从未覆盖的全局变量.

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

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