Javascript 为什么定义为全局的变量是未定义的?
这里有一个简单的函数和一个全局变量 为什么Javascript 为什么定义为全局的变量是未定义的?,javascript,global-variables,local-variables,hoisting,Javascript,Global Variables,Local Variables,Hoisting,这里有一个简单的函数和一个全局变量 为什么myname未定义而不是字符串“全局” 不能引用在该函数范围之外定义的外部变量吗?这是一个全局变量 如何解决这个问题,使我不会从全局变量中得到一个未定义的。在函数中,您要声明var myname=“local”。即使是在方法的中间,这个变量也有函数作用域,所以它属于整个函数,甚至它上面的代码。 因此,局部变量的值在该行之前是未定义的,在该行之后有一个值,但两个变量都没有触及全局变量。您刚刚偶然发现了一个名为“提升”的js“功能” var myname =
myname
未定义
而不是字符串“全局”
不能引用在该函数范围之外定义的外部变量吗?这是一个全局变量
如何解决这个问题,使我不会从全局变量中得到一个未定义的
。在函数中,您要声明var myname=“local”
。即使是在方法的中间,这个变量也有函数作用域,所以它属于整个函数,甚至它上面的代码。
因此,局部变量的值在该行之前是未定义的,在该行之后有一个值,但两个变量都没有触及全局变量。您刚刚偶然发现了一个名为“提升”的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。第一个警报未定义的原因是,您在函数中将全局
声明为其下方的局部变量。在javascript中,这意味着从函数的顶部开始,它被视为局部变量
它下面的那一个之所以有效,是因为在警报上方您给了它一个值。我想,您忘记了全局变量上的“var”。我相信@crc442是正确的。你能发布你的错误消息来确认吗?@crc442-我相信你不知道你在说什么。全局变量的“var”是可选的,虽然不是很好的做法。哦!我完全忘了。那是我说话的本能。对此我很抱歉。这是正确的答案,我被误解了。这是有道理的。不过我有一个问题。为什么声明与函数第3行中的赋值分开?@codingpuss不会移动到赋值发生的位置。它只复制函数中需要的变量,并在顶部声明它们。如果在浏览器中,您可以使用
窗口变量,而不是全局变量。@Preza8 JS是在一周内设计的。考虑到这一点,我认为这是非常好的。我不认为你答案的这一部分是精确的:“因此,在这一行之前,局部变量的值是未定义的……”。var语句在javascript(提升)中被移到了顶部,因此它是在其分数内的任何其他代码(在本例中是函数)之前执行的。作为一名新的程序员,无论我读了多少答案,我都无法找到这个问题的解决方案。问题是,我假设每次我想修改一个变量时,我都必须以var
开头(比如var myVariable=1;
,var myVariable=myVariable+3;
),而实际上,您应该只在第一次初始化变量时放入var
)。在此之后的所有其他时间,您只需以变量名开始行,并删除var
(例如var myVariable=1;
,myVariable=myVariable+3;
)。(否则会出现类似此问题的问题)
var global = this; // in global scope.
var myname = "global";
var obj = {f: function () {
var myname = "local";
console.log(global.myname);
}};
obj.f(); // "global"