你刚刚偶然发现了一个叫做提升的 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。