我正在浏览此代码,在此行上,我看到了
(窗口).user =用户;
我想知道将用户对象设置为窗口对象中的值的重要性是什么?我知道将来可能会更容易访问,但是用户对象也存储在可观察到的get user()方法中,从可观察到的:
中检索它。getUser(): Observable<any> {
return this.$userSource.asObservable();
}
也从这个答案中了解:
在JavaScript中,任何全局变量实际上都是窗口对象的属性。使用一个相当于使用另一个。
所以我的问题是:
- 将用户对象设置为窗口对象中的值的重要性是什么?
- 如果我们摆脱了将代码存储在窗口对象中的行,代码仍然可以正常运行吗?
- 打字稿类中的全局变量与窗口对象的属性相同吗?例如:此值也是窗口对象的属性吗?
在全局上使用变量几乎没有问题。
-
window
是全局。
这是一个例子,为什么这很危险。
window.item = {
name: 'Something great'
};
function selectItem() { //wrong line
item.name = 'selected';
}
selectItem(event.target);
您可以看到开发人员忘记添加函数selectItem
的参数item
。预计会更改点击项目的名称,但全局项目将被更改。
-
this
=window
,如果您不使用严格模式,则this
等于window
。
让我们以相同的示例来进行,但这次我们将使用上下文。
function selectItem() {
this.name = 'selected'
}
const item = {
name: 'An item'
}
selectItem.call(item); //Assume that item is somehow undefined or null.
再次结果,window.name
将被更改。
- 全球是针对全球的,封装了它。
我可以轻松访问window
及其变量。我还可以定义您所做的相同变量。或者我可能会访问您的变量,这将是一个安全问题。
- 测试
您无法测试可以轻松在全球上具有变量的东西。因为它没有封装在您的范围上。
- 在全球范围内,没有垃圾收集。我想危险已经足够明显。
回答您的问题:
- 阅读以上
- 阅读以上
- 那条线有公共财产。它不是全局。它未在窗口上定义。它将是实例的属性。
window
对象是全局。
这意味着如果您写
window.user = null
您删除了图书馆设置的先前值。
通常认为将变量存储到窗口对象中是不良习惯。
回答您:
- 一点都不重要,甚至灰心
- 您必须检查该库中的
- 不,他们不是:没有"全球类变量"。它是全局变量,要么是类成员。但是全局变量也可以在打字稿中进行。