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

时间:2017-01-01 21:06:19

标签: javascript names

编码时我意识到某些变量名称(例如topselfleft\right会在您尝试使用它们时产生各种错误。在JavaScript中这背后的原因是什么,而其他语言可以使用它们?

3 个答案:

答案 0 :(得分:3)

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

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

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

尝试为这些变量分配一些值将运行setter,这可能无法达到预期效果。如果只有一个getter但没有setter,那么在sloppy模式下将忽略赋值并以严格模式抛出。

将这些名称用作局部变量没有问题。不管怎么说,你不应该使用全局变量。

(function() {
  var top = 123; // local variable
  console.log(top === 123); // true - no problem
})();
var top = 456; // global variable
console.log(top === 456); // false !!!

答案 1 :(得分:2)

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

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

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

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

答案 2 :(得分:2)

很可能您使用变量而不使用var / let声明变量,在这种情况下,您可以修改全局执行环境的属性。

在浏览器中,全局执行环境为window,因此当您执行

self = '...'

你有效地做了

window.self = '...'

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

相反,当你这样做时

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

你不应该有任何问题。

您需要一个函数调用才能使其正常工作,以创建新范围,因为在全局范围内,即使使用var,您仍然会隐式地将属性分配给window