将值存储在Angular中的窗口对象中的值是什么?



我正在浏览此代码,在此行上,我看到了

(窗口).user =用户;

我想知道将用户对象设置为窗口对象中的值的重要性是什么?我知道将来可能会更容易访问,但是用户对象也存储在可观察到的get user()方法中,从可观察到的:

中检索它。
getUser(): Observable<any> {
    return this.$userSource.asObservable();
}

也从这个答案中了解:

在JavaScript中,任何全局变量实际上都是窗口对象的属性。使用一个相当于使用另一个。

所以我的问题是:

  1. 将用户对象设置为窗口对象中的值的重要性是什么?
  2. 如果我们摆脱了将代码存储在窗口对象中的行,代码仍然可以正常运行吗?
  3. 打字稿类中的全局变量与窗口对象的属性相同吗?例如:此值也是窗口对象的属性吗?

在全局上使用变量几乎没有问题。

  1. window是全局。

这是一个例子,为什么这很危险。

window.item = {
    name: 'Something great'
};
function selectItem() { //wrong line
    item.name = 'selected';
}
selectItem(event.target);

您可以看到开发人员忘记添加函数selectItem的参数item。预计会更改点击项目的名称,但全局项目将被更改。

  1. 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将被更改。

  1. 全球是针对全球的,封装了它。

我可以轻松访问window及其变量。我还可以定义您所做的相同变量。或者我可能会访问您的变量,这将是一个安全问题。

  1. 测试

您无法测试可以轻松在全球上具有变量的东西。因为它没有封装在您的范围上。

  1. 在全球范围内,没有垃圾收集。我想危险已经足够明显。

回答您的问题:

  1. 阅读以上
  2. 阅读以上
  3. 那条线有公共财产。它不是全局。它未在窗口上定义。它将是实例的属性。

window对象是全局。

这意味着如果您写

window.user = null

您删除了图书馆设置的先前值。

通常认为将变量存储到窗口对象中是不良习惯。

回答您:

  1. 一点都不重要,甚至灰心
  2. 您必须检查该库中的
  3. 不,他们不是:没有"全球类变量"。它是全局变量,要么是类成员。但是全局变量也可以在打字稿中进行。

相关内容

  • 没有找到相关文章

最新更新