为什么定义为全局的变量未定义?
Why a variable defined global is undefined?
我这里有一个简单的函数和一个全局变量。
Why is myname
undefined
and not the string "global"
?
var myname = "global"; // global variable
function func() {
alert(myname); // "undefined"
var myname = "local";
alert(myname); // "local"
}
func();
无法引用定义在该函数范围之外的外部变量吗?在这个全局变量中...
我该如何解决这个问题,这样我就不会从全局变量中得到 undefined
?
在函数内部,您要声明 var myname = "local"
。即使您是在方法的中间执行此操作,该变量也具有函数作用域,因此它属于整个函数,甚至是它上面的代码。
所以局部变量的值在该行之前是未定义的,并且在之后有一个值,但是两者都没有触及全局变量。
你刚刚偶然发现了一个叫做 hoisting
的 js "feature"
var myname = "global"; // global variable
function func() {
alert(myname); // "undefined"
var myname = "local";
alert(myname); // "local"
}
func();
在这段代码中,当您定义 func
时,编译器会查看函数体。它看到您正在声明一个名为 myname
.
的变量
Javascript Hoists variable and function declarations, by moving the declaration to the top of the function.
因为提升你的代码被重写为以下内容。
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();
这个"Covers"全局变量。如果要在函数范围内访问全局变量,请使用 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。
第一个警报未定义的原因是因为您在函数中将 global
重新声明为其下方的局部变量。在 javascript 中,这意味着从函数的顶部开始,它被认为是局部变量。
它下方的那个有效,因为您在警报上方给了它一个值。
我这里有一个简单的函数和一个全局变量。
Why is
myname
undefined
and not the string"global"
?
var myname = "global"; // global variable
function func() {
alert(myname); // "undefined"
var myname = "local";
alert(myname); // "local"
}
func();
无法引用定义在该函数范围之外的外部变量吗?在这个全局变量中...
我该如何解决这个问题,这样我就不会从全局变量中得到 undefined
?
在函数内部,您要声明 var myname = "local"
。即使您是在方法的中间执行此操作,该变量也具有函数作用域,因此它属于整个函数,甚至是它上面的代码。
所以局部变量的值在该行之前是未定义的,并且在之后有一个值,但是两者都没有触及全局变量。
你刚刚偶然发现了一个叫做 hoisting
的 js "feature"var myname = "global"; // global variable
function func() {
alert(myname); // "undefined"
var myname = "local";
alert(myname); // "local"
}
func();
在这段代码中,当您定义 func
时,编译器会查看函数体。它看到您正在声明一个名为 myname
.
Javascript Hoists variable and function declarations, by moving the declaration to the top of the function.
因为提升你的代码被重写为以下内容。
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();
这个"Covers"全局变量。如果要在函数范围内访问全局变量,请使用 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。
第一个警报未定义的原因是因为您在函数中将 global
重新声明为其下方的局部变量。在 javascript 中,这意味着从函数的顶部开始,它被认为是局部变量。
它下方的那个有效,因为您在警报上方给了它一个值。