您刚刚偶然发现了一个称为提升的 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。