var name和window.name

Ste*_*ale 8 javascript

如果我定义一个名为的JavaScript全局变量name,是否会隐藏window.name属性?

我在Facebook JavaScript身份验证API的上下文中提出这个问题,因为我注意到具有该名称的全局会破坏它,并且因为我看到它window.name在他们的代码中使用.

Mat*_*lin 6

如果name是全局变量,那么namewindow.name是等价的.

全局变量和函数是全局对象的成员.在浏览器中,全局对象包含一个窗口成员,其值是全局对象.


Ry-*_*Ry- 5

如果您使用 声明全局范围内的变量var,它将在全局对象上创建一个属性或写入现有属性(如name):

\n\n
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\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果你用letor声明它const,它将\xe2\x80\x99t:

\n\n
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\n
Run Code Online (Sandbox Code Playgroud)\n