为什么我不能在 javascript 中使用某些变量名?
Why can't I use certain variable names in javascript?
在编写代码时,我意识到某些变量名称(例如 top
、self
、left\right
在您尝试使用它们时会产生各种错误。 JavaScript 这背后的原因是什么,而其他语言可以使用它们?
在大多数情况下,在 JavaScript 中使用这些名称的变量没有问题。
在某些环境中,一些名称已用于现有的全局变量并且是只读的。
top
就是这样一个例子,它指的是the top level frame.
您仍然可以将其用作非全局上下文中的变量名。
很可能您使用变量而不用 var
/let
声明它们,在这种情况下,您修改了全局执行环境的属性。
在浏览器中,全局执行环境是window
,所以当你
self = '...'
你有效地做到了
window.self = '...'
self
、top
、left
、right
是 window
对象的属性,可能具有某些非标准行为。 window
对象的许多内置属性实际上是隐式设置器,它们不仅仅是设置变量 - 它们还可以修改当前页面、导航等。此外,window
的许多内置属性可以不会被覆盖,因此分配给它们无效。
相反,当你这样做时
(function() {
var self = '...'
})()
你应该没有任何问题。
你需要一个函数调用来让它正常工作,创建一个新的作用域,因为在全局作用域中,即使使用 var
,你仍然会隐式地分配一个 属性 给 window
.
您不能将它们用作 全局 变量,因为已经存在具有这些名称的全局访问器属性。
top
用于访问顶层框架
self
用于访问全局对象
- 据我所知
left
和right
没有问题。
console.log(Object.getOwnPropertyDescriptor(window, 'top'));
console.log(Object.getOwnPropertyDescriptor(window, 'self'));
尝试为这些变量分配一些值将 运行 setter,这可能不会达到您的预期。如果只有getter而没有setter,赋值在草率模式下会被忽略,在严格模式下会抛出
使用这些名称作为局部变量是没有问题的。无论如何你都不应该使用全局变量。
(function() {
var top = 123; // local variable
console.log(top === 123); // true - no problem
})();
var top = 456; // global variable
console.log(top === 456); // false !!!
在编写代码时,我意识到某些变量名称(例如 top
、self
、left\right
在您尝试使用它们时会产生各种错误。 JavaScript 这背后的原因是什么,而其他语言可以使用它们?
在大多数情况下,在 JavaScript 中使用这些名称的变量没有问题。
在某些环境中,一些名称已用于现有的全局变量并且是只读的。
top
就是这样一个例子,它指的是the top level frame.
您仍然可以将其用作非全局上下文中的变量名。
很可能您使用变量而不用 var
/let
声明它们,在这种情况下,您修改了全局执行环境的属性。
在浏览器中,全局执行环境是window
,所以当你
self = '...'
你有效地做到了
window.self = '...'
self
、top
、left
、right
是 window
对象的属性,可能具有某些非标准行为。 window
对象的许多内置属性实际上是隐式设置器,它们不仅仅是设置变量 - 它们还可以修改当前页面、导航等。此外,window
的许多内置属性可以不会被覆盖,因此分配给它们无效。
相反,当你这样做时
(function() {
var self = '...'
})()
你应该没有任何问题。
你需要一个函数调用来让它正常工作,创建一个新的作用域,因为在全局作用域中,即使使用 var
,你仍然会隐式地分配一个 属性 给 window
.
您不能将它们用作 全局 变量,因为已经存在具有这些名称的全局访问器属性。
top
用于访问顶层框架self
用于访问全局对象- 据我所知
left
和right
没有问题。
console.log(Object.getOwnPropertyDescriptor(window, 'top'));
console.log(Object.getOwnPropertyDescriptor(window, 'self'));
尝试为这些变量分配一些值将 运行 setter,这可能不会达到您的预期。如果只有getter而没有setter,赋值在草率模式下会被忽略,在严格模式下会抛出
使用这些名称作为局部变量是没有问题的。无论如何你都不应该使用全局变量。
(function() {
var top = 123; // local variable
console.log(top === 123); // true - no problem
})();
var top = 456; // global variable
console.log(top === 456); // false !!!