javascript变量是怎样的;吊运;在这些来自MDN的示例中

javascript变量是怎样的;吊运;在这些来自MDN的示例中,javascript,Javascript,在mozilla的文章中,我读到: JavaScript中变量的另一个不寻常之处是,您可以引用稍后声明的变量,而不会得到异常。这个概念被称为提升;JavaScript中的变量在某种意义上被“提升”或提升到函数或语句的顶部。但是,尚未初始化的变量将返回未定义的值 还有一些例子: /** * Example 1 */ console.log(x === undefined); // logs "true" var x = 3; /** * Example 2 */ // will ret

在mozilla的文章中,我读到:

JavaScript中变量的另一个不寻常之处是,您可以引用稍后声明的变量,而不会得到异常。这个概念被称为提升;JavaScript中的变量在某种意义上被“提升”或提升到函数或语句的顶部。但是,尚未初始化的变量将返回未定义的值

还有一些例子:

/**
 * Example 1
 */
console.log(x === undefined); // logs "true"
var x = 3;


/**
 * Example 2
 */
// will return a value of undefined
var myvar = "my value";

(function() {
  console.log(myvar); // undefined
  var myvar = "local value";
})();
上述示例2将被解释为:


我看不到任何东西被“提升”——至少不是在我传统上解释这个词的定义的意义上:似乎变量在声明之前都是未定义的。在什么意义上可以“引用稍后声明的变量”

当您使用
var
时,它被“提升”到函数声明的顶部。让我们再看看第二个例子:

var myvar = "my value";

(function() {
  console.log(myvar); // undefined
  var myvar = "local value";
})();
注意如何首先声明
var myvar='my value'
。接下来,在函数范围内,调用
console.log(myvar)
。结果是“未定义的”。为什么?你会认为这是“我的价值”,因为这是代码的顺序

由于函数作用域中的局部变量
var myvar
已被提升,因此未对其进行定义。这本质上等同于这样编写函数:

(function() {
  var myvar;
  console.log(myvar); // undefined
  myvar = "local value";
})();

因此,
var myvar
被理解为在函数的范围内提升,因为它是在函数外部声明的,还是在函数内部声明的?@matthewpavkov,因为它是在函数内部声明的。我相信您知道“highed”的意思是“highed up”。因此,想象一下
var myvar
行被“highed”到了函数范围内部的顶部。开始理解它。非常感谢。我只是不明白如何
var myvar=“我的价值”(function(){var myvar;….
之前声明的代码>,也就是说,其全局声明的值(在正下方的即时函数之外)不会“保存到”即时函数中。为什么
控制台.log(myvar)不会;//未定义的
不是
我的值
?另外,你能给我一个实用的例子说明如何有效地实现这些知识吗?非常感谢。@thomas这不是一个可以方便地使用的东西,它只是用于防止错误的JavaScript的一部分。你应该始终在当前范围和永远不要依赖提升。提升“此变量在此范围语义中声明”;不移动赋值。不提升(这将使其成为另一种语言:D),第二个示例是指log语句中的外部
myvar
。现在,它指的是内部
myvar
,它将外部变量隐藏起来;在log语句中,该值只是未定义-提升不会影响赋值。@pst好的。请耐心等待,因为雾最终会消散……我能问你什么吗你的意思是“阴影”外部变量?“暂时覆盖”-它阻止原始[外部作用域变量]被看到/使用:D
(function() {
  var myvar;
  console.log(myvar); // undefined
  myvar = "local value";
})();