首页 > 解决方案 > 在 Angular 的窗口对象中存储值有什么好处?

问题描述

我正在浏览这段代码,在这一行我看到了

(窗口).user = 用户;

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

getUser(): Observable<any> {
    return this.$userSource.asObservable();
}

同样从这个答案中,我了解到:

在 JavaScript 中,任何全局变量实际上都是窗口对象的属性。使用一个等同于(并且可以互换)使用另一个。

所以我的问题是:

  1. 将用户对象设置为窗口对象中的值有什么重要性?
  2. 如果我们去掉将代码存储在窗口对象中的行,代码仍然可以正常运行吗?
  3. typescript 类中的全局变量是否与 window 对象的属性相同?例如:这个值也是窗口对象的属性吗?

标签: javascriptangularwindowglobal-variablesglobal

解决方案


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

  1. window是全球性的。

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

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

如您所见,开发人员忘记item为函数添加参数selectItem。预计会更改单击项目的名称,但全局项目将被更改。

  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. global 是全局的,封装它。

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

  1. 测试

您无法轻松测试具有全局变量的东西。因为它没有封装到您的范围内。

  1. 在全局范围内,没有垃圾收集。我想危险已经很明显了。

要回答您的问题:

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

推荐阅读