【问题标题】:javaScript hoisting not working properlyjavaScript提升无法正常工作
【发布时间】:2016-08-27 14:14:05
【问题描述】:

这些是必须达到相同结果的 2 个示例:

示例 1

<script>
console.log(a);
var a = 10;
console.log(a);
</script> 

渲染

<script>
var a = "";
console.log(a); //will result undefined
a = 10;
console.log(a); //will result 10
</script> 

结果

undefined 
10

示例 2

<script>
console.log(a);
a = 10;
console.log(a);
</script> 

渲染预期

<script>
var a = "";
console.log(a); //should result undefined 
a = 10;
console.log(a); //should result 10
</script> 

结果

现在,根据 场景 2 中的 JS 提升,如果未声明的变量必须已自动声明到其作用域的顶部,并且结果应该是相同的。为什么不是?理念失败在哪里?

【问题讨论】:

  • 从哪里获取渲染的代码信息?
  • 只需输入var a = 10,您就会得到您所期望的。 a = 10var a = 10不一样:stackoverflow.com/questions/1470488/…
  • 我写了JS必须如何渲染代码!
  • "" 不是未定义的。
  • 好的,@Peterson,因为它是错误的 :)

标签: javascript scope hoisting


【解决方案1】:

第二种情况不同,因为

a = 10

... 不声明提升变量。它在window 对象中创建一个属性(即使代码可能在函数内部)。这不是一个声明,因此是 not 提升的。因此,在您创建该属性之前,它并不存在。

请注意,您列出的渲染代码并不完全正确。提升的变量没有值,因此对于您的第一个示例,它应该如下所示:

var a; // undefined!
console.log(a); // will output undefined
a = 10;
console.log(a); // will output 10

请注意,如果此代码不是函数体的一部分,var a会创建window.a 属性,这发生在被提升的声明中。

对于您的第二个示例,渲染的代码可能看起来像这样

console.log(a); // Error: does not exist. 
window.a = 10;
console.log(a); // will output 10

【讨论】:

    【解决方案2】:

    JavaScript 提升声明,而不是初始化,请参阅 this page

    如果你添加一个 'var a;'在您的第二个示例中的某处,它应该可以正常工作!

    【讨论】:

    • 第一句话一针见血。说得好!
    【解决方案3】:

    在示例 2 中,在您运行第一个控制台日志时,a 确实未定义。

    a = 10 将新属性 a 设置为 window 对象,并且在将属性设置为已存在的对象时没有“提升”。

    【讨论】:

      【解决方案4】:

      当我们将执行源代码.IN 提升时,声明变量通过console.log()。然后变量允许内存但不访问它。当我在内存中声明一个变量时。然后我们默认给出未定义的值来代替该变量。 (就像,在 html 中,place Holder 是这样工作的。 --- 所以你没有声明任何变量。托管在这里不起作用。 --- 不能在这里访问..因为当你定义一个变量时。 然后你必须定义一个变量。这里你不能做变量所以输出:cannot access a

      【讨论】:

      • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 1970-01-01
      • 2014-04-06
      • 2015-05-23
      • 2012-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      相关资源
      最近更新 更多