大家好,我有一个简单的函数和一个全局变量。
为什么
myname
undefined
而不是字符串"global"
?
var myname = "global"; // global variable
function func() {
alert(myname); // "undefined"
var myname = "local";
alert(myname); // "local"
}
func();
是否无法引用在该函数范围之外定义的外部变量?在这个全局变量......
我如何解决这个问题,所以我从全局变量中得不到undefined
?
答案 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(不是字符串)