Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么定义为全局的变量是未定义的?_Javascript_Global Variables_Local Variables_Hoisting - Fatal编程技术网

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"