今天,当我看到全局变量undefined
在某些情况下具有价值时,我感到非常惊讶。
例:
var value = 10;
function test() {
//A
console.log(value);
var value = 20;
//B
console.log(value);
}
test();
给出为
undefined
20
在这里,为什么JavaScript引擎将全局值视为undefined
。我知道JavaScript是一种解释语言。如何考虑函数中的变量?
这是JavaScript引擎的陷阱吗?
这种现象称为:JavaScript变量提升 。您绝对不会在函数中访问全局变量。您只访问局部value
变量。
您的代码等效于以下内容:
var value = 10;
function test() {
var value;
console.log(value);
value = 20;
console.log(value);
}
test();
还感到惊讶undefined
吗?
每个JavaScript程序员迟早都会碰到这一点。简单地说,任何变量声明总是悬挂到本地盖顶部。因此,即使您在第一次console.log
调用后声明了变量,也仍然会认为它是在此之前声明的。但是,只有声明部分被提升;另一方面,分配不是。
因此,当您第一次调用时console.log(value)
,您引用的是本地声明的变量,该变量尚未分配任何内容。因此undefined
。
var test = 'start';
function end() {
test = 'end';
var test = 'local';
}
end();
alert(test);
您认为这会引起什么警报?不,不要只是继续阅读,请考虑一下。有什么价值test
?
如果您说的不是start
,则您错了。上面的代码与此等效:
var test = 'start';
function end() {
var test;
test = 'end';
test = 'local';
}
end();
alert(test);
这样全局变量就不会受到影响。
正如你所看到的,无论在哪里你把你的变量声明中,它始终是悬挂到本地盖顶部。
这也适用于功能。
test("Won't work!");
test = function(text) { alert(text); }
这将为您提供参考错误:
未捕获的ReferenceError:未定义测试
因为这段代码可以正常工作,所以这使很多开发人员不满意:
test("Works!");
function test(text) { alert(text); }
如上所述,其原因是 未 悬挂分配部件。因此,在第一个示例中,在test("Won't work!")
运行时,test
已经声明了该变量,但是尚未为其分配功能。
在第二个示例中,我们不使用变量赋值。相反,我们使用了正确的函数声明语法,这确实使函数完全提升了。
问题内容: 是否可以在JavaScript函数中定义全局变量? 我想在其他函数中使用变量(在函数中声明)。 问题答案: 是的,正如其他人所说的,您可以在全局范围内(在所有函数之外)使用声明全局变量: 或者,您可以在上分配一个属性: …因为在浏览器中,用声明的 所有全局变量 都是对象的属性。(在最新规范ECMAScript 2015中,全局范围内的new ,和语句创建的不是全局对象属性的全局变量;这
问题内容: JavaScript中的另一种常见情况是为变量提供预设值(如果未定义),例如: 快捷方式表示法是双竖线字符: 由于某种原因,我无法为我工作。是否真的有可能检查是否定义了v,如果x = 10则不定义? 谢谢。 问题答案: 该Opera文章对正在发生的事情给出了不好的描述。 确实会得到if is 的值。如果具有 任何 “假”值也将是正确的。 __ JavaScript中的“ falsey”
问题内容: 在Coffeescript.org上: 将编译为: 通过在node.js下的coffee-script进行编译可以做到: 文件说: 如果要创建供其他脚本使用的顶级变量,请将它们作为属性附加到窗口或CommonJS中的exports对象上。如果您同时针对CommonJS和浏览器,那么存在运算符(见下文)为您提供了一种可靠的方法来确定将它们添加到何处:root = exports?这个 然
问题内容: 在以下片段中 内部是一个新变量, 外部 将保持为空。 通过显式定义短变量定义并将其替换为赋值,似乎可以正确地初始化外部变量 有没有一种更简单的方法来指定内部变量,而不是实际上是作用域变量,而是全局变量?我在想类似的东西,但这在包本身内部无效。 问题答案: 不,就是这样。只是 New()( https://golang.org/doc/effective_go.html#allocati
本文向大家介绍PHP 用户定义的全局变量,包括了PHP 用户定义的全局变量的使用技巧和注意事项,需要的朋友参考一下 示例 任何函数或类之外的范围都是全局范围。当PHP脚本包含另一个脚本(使用include或require)时,范围保持不变。如果脚本包含在任何函数或类的外部,则其全局变量包含在同一全局范围内,但是如果脚本包含在函数内部,则所包含脚本中的变量位于函数的范围内。 在函数或类方法的范围内,
我正在尝试使用HTML、CSS和Javascript制作一个简单的哑巴井字游戏。 在下面的播放器移动函数中,由于JSON对象中存在Typeerror,因此无法调用ComputerMove函数。 下面是JSON对象:- 检查功能始终有效,控制台响应如下 调试时,我发现在此错误之后,计算机移动()函数永远不会被调用。所以请帮忙。