如果我定义一个名为的JavaScript全局变量name,是否会隐藏window.name属性?
我在Facebook JavaScript身份验证API的上下文中提出这个问题,因为我注意到具有该名称的全局会破坏它,并且因为我看到它window.name在他们的代码中使用.
如果您使用 声明全局范围内的变量var,它将在全局对象上创建一个属性或写入现有属性(如name):
var name = 5;\nconsole.log(window.name === '5'); // true\nconsole.log(name === '5'); // true\nconsole.log(Object.getOwnPropertyDescriptor(window, 'name'));\n // object with get and set\n\nvar foo = 6;\nconsole.log(Object.getOwnPropertyDescriptor(window, 'foo'));\n // object with value\n\nObject.defineProperty(window, 'bar', {\n writable: false,\n});\n\nvar bar = 7; // throws in strict mode\n\nvar baz;\nconsole.log('baz' in window); // true\nRun Code Online (Sandbox Code Playgroud)\n\n如果你用letor声明它const,它将\xe2\x80\x99t:
const name = 5;\nconsole.log(window.name); // likely an empty string\nconsole.log(name === 5); // true\nconsole.log(Object.getOwnPropertyDescriptor(window, 'name'));\n // same as var\n\nconst foo = 6;\nconsole.log(window.foo); // undefined\nconsole.log(Object.getOwnPropertyDescriptor(window, 'foo'));\n // undefined\n\nObject.defineProperty(window, 'bar', {\n writable: false,\n});\n\nconst bar = 7; // succeeds\n\nlet baz;\nconsole.log('baz' in window); // false\nRun Code Online (Sandbox Code Playgroud)\n