在JavaScript范围基于可变阴影(Scope based variable shadowing

2019-09-18 06:55发布

我难以理解基于示波器的JavaScript变量阴影。 考虑这个小的代码片段:

var k = {
    prop1: 'test',
    prop2: 'anotherTest'
}

for(var k = 0; k < 10; k++) {
    console.log(k);
}

//prints number
console.log(typeof k);

//prints 10
console.log(k);

//undefined
console.log(k.prop1);

这是好的,因为由于直接作用范围,循环计数器变量k阴影的JSON变量k我们前面declated。 因此,JSON变量k变得不可访问可以这么说。

题:


  1. 在内存分配方面,现在没有办法访问原始JSON变种K,是符合垃圾回收? 将已分配的内存被释放? 或“参考孤儿”的变量仍然生活呢? 如果是的话,为什么多长时间?

  2. 是否有访问原始的JSON VARķ无前的for循环编写任何代码的方式?

现在考虑另一个稍微修改的代码片段:

var k = {
    prop1: 'test',
    prop2: 'anotherTest'
}

var m = {
    prop1: k
}

for(var k = 0; k < 11; k++) {
    console.log(k);
}

//prints number
console.log(typeof k);

//prints 10
console.log(k);

//undefined
console.log(k.prop1);

//reference altered? No, this reference points to the original json k
//firebug dumps object to console
console.log(m.prop1);

题:


  1. 这一次,我们手上之前坚持原始的k个参考,在另一个JSON对象。 和肯定,内存不会被取消分配。 但是,不会评估m.prop1解析到一个更新的整数k,为10的价值? 为什么不是该决议导致循环计数器值为10?

Answer 1:

1#在内存分配方面,现在没有办法访问原始JSON变种K,是符合垃圾回收? 将已分配的内存被释放? 或“参考孤儿”的变量仍然生活呢? 如果是的话,为什么多长时间?

只有一个叫可变kvar在其他语言的意义不“声明变量” 1。 这里没有阴影 。 相反,它是提升到函数的顶部的注释。

先前由已知对象k不再强可因此可以回收。 (究竟何时是依赖于实现,但它是符合条件的。)

2#是否有访问原始的JSON VARķ无前的for循环编写任何代码的方式?

只有一个叫可变kvar在其他语言的意义不“声明变量” 1。 这里没有阴影 。 相反,它是提升到函数的顶部的注释。

在循环中的分配将覆盖相同 k变量。

3#这一次,我们的前手握住,以原始的k个基准,在另一个JSON对象。 和肯定,内存不会被取消分配。 但是,不会评估m.prop1解析到一个更新的整数k,为10的价值? 为什么不是该决议导致循环计数器值为10?

变量是不是对象。 表达式,包括变量名,在JavaScript中急切地评估 。 由可变命名的对象km = { prop1: k }进行评价现在被命名为m.prop1 。 分配一个新的值给变量 k因此没有什么效果k 先前评价。

在JavaScript中变量的唯一引用出现在赋值的左手侧或像运营商typeofdel 。 变量是从来没有在一个表达式生产,否则引用。 不要用混淆引用的call-by-对象共享 ,或者“对象变异”,语义学:改变这种对象的对象发生变异的特性 。 (如图所示,某些类型的像number不变的 ,不允许自定义属性“粘”。)


以上假设的代码中出现的功能。 对于规则的var略有不同,当任何功能之外-在这种情况下它声明一个局部变量,而k只想(仍然)是指全球window.k财产。

1正确的术语 “声明”; 不过,我觉得它是思想作为一个注解,因为它是关于一个功能全属性x和语句的意义不是“评价”,更清晰。 例如,这两个功能是等效的:

function () { var x = 1; return x }
function () { x = 1; return x; var x }

也可以看看:

  • JavaScript的作用域和吊装

  • 使用VAR和JavaScript中不使用VAR(由kangax答案)之间的差异



文章来源: Scope based variable shadowing in JavaScript