我能在 JavaScript 中为 'window' 对象添加任何随机属性吗?就像这样:
window.my_own_attr = "my_value"
它是否与任何库存在副作用?并且它是否跨浏览器兼容?
我能在 JavaScript 中为 'window' 对象添加任何随机属性吗?就像这样:
window.my_own_attr = "my_value"
它是否与任何库存在副作用?并且它是否跨浏览器兼容?
window
是 JavaScript 的全局命名空间。每个属性或方法都存在于该命名空间中。因此,如果您将一个属性分配给window
,它实际上就是一个全局变量。window.myConstant = 5;
// note: a var declaration will be a window property too
// note 2: 'let' or 'const' will not be window properties
// below can also be done without 'var'.
var myConstantGlobal = 4;
console.log(`multiply(10) => ${multiply(10)}`);
console.log(`multiply() => ${multiply()}`);
console.log(`multiplyGlobalVar(10)) => ${multiplyGlobalVar(10)}`);
console.log(`multiplyGlobalVar() => ${multiplyGlobalVar()}`);
function multiply(val){
return myConstant * (val || 1);
}
function multiplyGlobalVar(val){
return window.myConstantGlobal * (val || 1);
}
在使用JavaScript框架时要非常小心。例如,如果您声明了window.JQuery
并使用JQuery
框架,则JQuery
命名空间将被您的赋值所替换,从而使其无用。
是的,你可以这样做,但一般情况下不应该这么做。
window
对象也是 JS 默认的“全局”对象,因此所有全局变量都会被添加到其中。
除非你覆盖了已经存在的属性,否则不太可能破坏任何东西,但是将变量放在 window
上或者创建很多全局变量被认为是不好的做法。
正如其他人指出的那样,是的,你可以这样做,这意味着添加“全局变量”。
拥有全局变量并不是最佳实践,但有时它是最简单的方法。例如,如果您使用IFrames并希望子窗口访问父窗口的某个属性,则此属性必须是“全局”的才能被子窗口访问。但这也表明它并不是“真正的全局”,它只是特定窗口的属性。但它可能会与其他属性名称冲突,例如在同一窗口中定义的函数名称,也许是您使用的某些库。
所以我们知道全局变量是不好的。如果我们决定仍然使用它们,有没有什么方法可以将它们的坏处最小化?
是的,有:定义一个具有更或多或少独特名称的SINGLE全局变量,并将一个OBJECT存储到其中。将您需要的所有其他“变量”作为该单个对象的字段存储。
这样,您不需要添加超过一个单个全局变量(每个窗口)。不太糟糕。
将其命名为更或多或少独特,以便不太可能与任何其他单个全局变量发生冲突。例如,您可以使用您的名称+“s”作为变量名:
window.Panus = {};
:-)
这样做没问题,除非使用相同的变量名称与任何库冲突,它可以在所有浏览器中工作,但不建议这样做,因为这会创建全局JS变量。
my_own_attr
而不需要使用 window.
,这会使其成为全局变量并可能与其他同名变量发生冲突。 - Riz在IE中,如果一个元素有一个id,则该节点可以作为属性在window对象上访问:
<div id="num"></div>
alert(num); //Element
num = 3; //抛出异常
var num = 3; //ok