我有一个问题,对于您经验丰富的JavaScript程序员(我更是后端/数据库开发人员)而言,这可能很明显。所以,如果这太简单了,请多多包涵!
我有以下代码:
var skill = "JavaScript";
function printSkill() {
console.log(skill); // <-- This prints undefined
var skill = "Java"; // <-- How can this possibly work?
console.log(skill); // <-- This prints "Java"
}
printSkill();
输出为:
未定义的
Java
我知道可以运行此代码,因为JavaScript尚未编译,而是在运行时进行解释(例如在C ++中不会编译)。但是为什么这个代码行得通呢?例如,当涉及例如C ++的范围规则时,为什么要undefined
记录日志而不是记录日志"JavaScript"
是显而易见的选择。而且,第二个日志为什么显示“ Java”,不是undefined
吗?
JavaScript分两步进行解析。首先,它找到所有函数和变量声明,然后执行代码。对于编译器来说,您的代码如下所示:
// declaration
var skill = undefined;
// declaration
function printSkill() {
// declaration
var skill = undefined;
// execution
console.log(skill);
skill = "Java";
console.log(skill);
}
// execution
skill = "JavaScript";
printSkill();
这种现象被许多人称为“吊装”,但它们并不是完全“提起”的。这就是编译器遍历代码的方式。
解决您的问题:
如果您打算skill
将范围内的内容替换为Java
,则在对其进行任何操作之前将声明和定义移到最上面。
如果您打算更换全球skill
,然后取出var
在skill
内部的功能。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句