javascript - 在 Angular 的窗口对象中存储值有什么好处?
问题描述
(窗口).user = 用户;
我想知道将用户对象设置为窗口对象中的值的重要性是什么?我知道这可能是为了将来更容易访问,但用户对象也存储在可观察对象中,并且 get user() 方法从可观察对象中检索它:
getUser(): Observable<any> {
return this.$userSource.asObservable();
}
同样从这个答案中,我了解到:
在 JavaScript 中,任何全局变量实际上都是窗口对象的属性。使用一个等同于(并且可以互换)使用另一个。
所以我的问题是:
- 将用户对象设置为窗口对象中的值有什么重要性?
- 如果我们去掉将代码存储在窗口对象中的行,代码仍然可以正常运行吗?
- typescript 类中的全局变量是否与 window 对象的属性相同?例如:这个值也是窗口对象的属性吗?
解决方案
在全局上使用变量几乎没有问题。
window
是全球性的。
这是一个为什么这很危险的例子。
window.item = {
name: 'Something great'
};
function selectItem() { //wrong line
item.name = 'selected';
}
selectItem(event.target);
如您所见,开发人员忘记item
为函数添加参数selectItem
。预计会更改单击项目的名称,但全局项目将被更改。
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
将被更改。
- global 是全局的,封装它。
我可以轻松访问window
及其变量。我也可以定义你所做的相同变量。或者我可能会访问您的变量,这将是一个安全问题。
- 测试
您无法轻松测试具有全局变量的东西。因为它没有封装到您的范围内。
- 在全局范围内,没有垃圾收集。我想危险已经很明显了。
要回答您的问题:
- 阅读以上部分
- 阅读以上部分
- 那条线有一个公共财产。它不是全球性的。它没有在窗口上定义。它将是实例的属性。
推荐阅读
- javascript - 这是一个记忆功能吗?
- c++ - 调用 BZ2_bzWriteClose 时的 Bzip2 STATUS_STACK_BUFFER_OVERRUN
- c# - 学习 UWP 教程时出错
- video - 如何在编码未知时以非 UTF-8 编码转换包含的字幕
- python - 如何将我的字典代码与我的词行索引应用程序集成?
- tree - 在跟踪组件数量时移除森林顶点
- javascript - Javascript中对象的“形状”一词是什么意思?
- windows - FFmpeg Batch 同时遍历两个不同文件夹中的文件
- python - Python Kafka 模拟 Kafka Consumer 的返回类型
- php - 如何解决此错误“访问 https://api.sandbox.paypal.com/v1/payments/payment 时出现 Http 响应代码 400。”