javaScript 吊装工作不正常
javaScript hoisting not working properly
这些是必须达到相同结果的 2 个示例:
Example 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
Example 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 提升,如果未声明的变量必须已自动声明到其作用域的顶部,并且结果应该是相同的。为什么不是呢?概念失败在哪里?
第二种情况不同,因为
a = 10
... 不声明提升变量。它在 window
对象中创建了一个 属性 (即使代码本来应该在函数内部)。这不是声明,因此 未 提升。因此,在您创建 属性 之前,它并不存在。
请注意,您列为 渲染代码 的内容并不完全正确。提升变量不会获得值,因此对于您的第一个示例,它应该如下所示:
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 中,当您 运行 第一个控制台日志时,a
确实未定义。
a = 10 将新的 属性 a
设置为 window
对象,并且在将 属性 设置为已经存在的对象时没有 'hoisting'存在。
JavaScript 提升声明,而不是初始化,参见 this page。
如果您在第二个示例中的某处添加 'var a;',它应该可以正常工作!
当我们将执行源代码.IN提升时,声明变量越过console.log()。然后变量允许内存但不访问它。当我在内存中声明一个变量时。然后我们默认给出 undefined 值来代替那个变量。 (就像,在 html 中,place Holder 是这样工作的。
--- 所以你还没有声明任何变量。托管在这里不起作用。
--- 无法访问此处..因为当您定义变量时。
那么你必须定义一个 variable.here u can not make variable so output: cannot access a
这些是必须达到相同结果的 2 个示例:
Example 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
Example 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 提升,如果未声明的变量必须已自动声明到其作用域的顶部,并且结果应该是相同的。为什么不是呢?概念失败在哪里?
第二种情况不同,因为
a = 10
... 不声明提升变量。它在 window
对象中创建了一个 属性 (即使代码本来应该在函数内部)。这不是声明,因此 未 提升。因此,在您创建 属性 之前,它并不存在。
请注意,您列为 渲染代码 的内容并不完全正确。提升变量不会获得值,因此对于您的第一个示例,它应该如下所示:
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 中,当您 运行 第一个控制台日志时,a
确实未定义。
a = 10 将新的 属性 a
设置为 window
对象,并且在将 属性 设置为已经存在的对象时没有 'hoisting'存在。
JavaScript 提升声明,而不是初始化,参见 this page。
如果您在第二个示例中的某处添加 'var a;',它应该可以正常工作!
当我们将执行源代码.IN提升时,声明变量越过console.log()。然后变量允许内存但不访问它。当我在内存中声明一个变量时。然后我们默认给出 undefined 值来代替那个变量。 (就像,在 html 中,place Holder 是这样工作的。 --- 所以你还没有声明任何变量。托管在这里不起作用。 --- 无法访问此处..因为当您定义变量时。 那么你必须定义一个 variable.here u can not make variable so output: cannot access a