将声明window.variable函数使值变为全局?

时间:2017-11-20 23:37:11

标签: javascript function variables

好吧,让我们说我有一个全局变量myVar,在函数myFunction()中,我写myVar = 2;。通常,这会使myVar等于<{1>} 内部函数。我的问题是,会在函数中声明2使window.myVar = 2等于myVar 全局(因此,函数外的2会返回{{1} }})?

1 个答案:

答案 0 :(得分:3)

首先快速回顾全局变量:

使用varlet声明的全局变量的行为方式不同。使用var定义的全局变量使用变量名称创建全局对象的不可配置属性,该变量名称无法删除。

&#13;
&#13;
var x = "var x";
console.log("window.x: " + window.x);
console.log( JSON.stringify(Object.getOwnPropertyDescriptor(window, "x")))
&#13;
&#13;
&#13;

但是使用let声明的全局变量不会成为全局对象的属性。如果您有一个window属性(在浏览器中)和一个同名的let变量,则必须使用window.限定窗口属性才能访问它:

&#13;
&#13;
let y = "let y";
window.y = "window.y";
console.log("y = " + y + "( using the identifier only)");
console.log("window.y = " + window.y);
&#13;
&#13;
&#13;

现在回到这个问题,

  1. 如果在全局范围内声明myVar并在函数中引用它,则将访问全局变量提供您尚未在函数内重新声明该变量或任何外部嵌套函数。如果没有重新编译,这种访问既可用于读写,也可在函数内执行myVar = 2将更新全局变量的值。

  2. 在函数中执行window.myVar = 2只会更新全局myVar变量的值(如果它是使用var声明的)。它可能会创建一个窗口属性,但不会更新全局let变量的值。

  3. 因此调用函数后警报中显示的myVar的值取决于

    • 是否通过在函数范围内重新声明变量(在函数本地或外部函数中)来掩盖全局声明,
    • 是否使用未加修饰的标识符引用myVar或作为命名窗口属性引用{/ li>
    • myVar最初是使用var还是let声明的。