为什么我不能在JavaScript中使用某些变量名?

问题描述:

虽然编码我意识到某些变量名称,如top,self,left\right当您尝试使用它们时会产生各种错误。 JavaScript背后的原因是什么,而其他语言可以使用它们?为什么我不能在JavaScript中使用某些变量名?

+1

底层语言,ECMAScript的,具有约40 *保留字*](http://ecma-international.org/ecma-262/7.0/index.html#sec-保留字)。它实现的主机环境(通常是浏览器中的JavaScript)也可能具有您需要避免的全局变量。 – RobG

您不能将它们用作全局变量,因为已经存在具有这些名称的全局访问器属性。

  • top用于访问顶部框架。
  • self用于访问全局对象。
  • 据我所知leftright没有问题。

console.log(Object.getOwnPropertyDescriptor(window, 'top')); 
 
console.log(Object.getOwnPropertyDescriptor(window, 'self'));

尝试一些值分配给这些变量将运行二传手,这可能不是你所期望的。如果只有一个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 !!!

在大多数情况下,在JavaScript中使用带有这些名称的变量没有任何问题。

在某些环境中,某些名称已用于现有全局变量并且是只读的。

top就是这样一个例子,它指的是the top level frame

您仍然可以将其用作非全局上下文中变量的名称。

大多数情况下,您可以使用变量而不用var/let声明它们,并且在这种情况下,您可以修改全局执行环境的属性。

在浏览器,全球执行环境window,所以当你

self = '...' 

你有效地做好

window.self = '...' 

selftopleftright为可具有window对象的属性某些非标准行为。 window对象的许多内置属性实际上是隐式设置器,它不仅仅是设置变量 - 它们还可以修改当前页面,导航等。此外,window的许多内置属性不能被覆盖,因此分配给它们没有效果。

相反,当你做

(function() { 
    var self = '...' 
})() 

你不应该有任何问题。

你需要调用一个函数,使其正常工作,创建一个新的范围,因为在全球范围内,即使有var,你还是一个属性隐含分配给window

+1

'var self'在全球范围内可能仍然存在问题。 – Oriol

+0

好点 - 我暗示假设使用函数内。更新 –