为什么全局定义的变量是未定义的
Why a variable defined global is undefined?
这里有一个简单的函数和一个全局变量
为什么
myname
是undefined
而不是字符串"global"
?
var myname = "global"; // global variable
function func() {
alert(myname); // "undefined"
var myname = "local";
alert(myname); // "local"
}
func();
不能引用在该函数作用域之外定义的外部变量吗?这里有一个全局变量…
我怎么能解决这个问题,所以我没有得到一个undefined
从一个全局变量?
你偶然发现了js的一个叫做提升的"特性"
var myname = "global"; // global variable
function func() {
alert(myname); // "undefined"
var myname = "local";
alert(myname); // "local"
}
func();
在这段代码中,当您定义func
时,编译器会查看函数体。它看到你正在声明一个名为myname
的变量。
通过将变量和函数声明移动到函数的顶部来提升变量和函数声明。
由于提升,您的代码被重写为以下内容。
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
关键字根据您调用函数的方式改变其绑定。
EDIT:为了完整
如果你想在任何上下文中访问全局变量,而不管函数类型如何,那么就声明一个按照约定永远不会覆盖的全局变量。
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。
在函数内部声明var myname = "local"
。即使你是在方法中间做的,这个变量也有函数作用域,所以它属于整个函数,甚至它上面的代码。
所以局部变量的值在该行之前是未定义的,在该行之后有一个值,但它们都没有触及全局变量
第一个警报未定义的原因是因为您在函数中将global
重新声明为它下面的一个局部变量。在javascript中,这意味着从函数的顶部来看,它被认为是局部变量。
下面这个有效,因为在警告的上面你给了它一个值
相关文章:
- Socket.IO未定义变量
- 更改 Javascript 对象中所有未定义变量的值
- coffeescript,类未定义变量
- 使用下划线未定义变量时发生抛出/捕获错误
- 网络浏览器正在成为“;严格的“;用于Javascript中未定义变量的操作
- 使用window.location时未定义变量
- 传递给数据的未定义变量
- bizzare未定义变量
- JavaScript 中全局范围内存在未定义变量的原因是什么?
- JavaScript onClick 参数表示未定义变量
- 在指令中使用 $scope.$watch 处理未定义变量的替代方法
- 对于循环错误:未捕获的引用错误,未定义变量.怎么了
- JavaScript / YouTube API - 未定义变量 YT
- 未捕获的引用错误:在测试真实性时未定义变量
- 通过使用JavaScript“未定义”(变量),我们可以释放系统内存
- 与未定义变量相关的错误
- Angularjs 控制器中的未定义变量
- 角度解析:未定义变量
- BackboneJS Uncaught ReferenceError:未定义变量
- 使用Underscore JS部分和for循环的未定义变量对象