以下任何一种模式是否有任何优势,或者它们是完全相同的,但有一种只是使用if else
简写?
此
if ((typeof ShopScript) === 'undefined') { ShopScript = {}; }
还是这个?
window.ShopScript = window.ShopScript || {};
我对window.ShopScript
感到好奇......在任何一种情况下,ShopScript
对象是否附加到窗口(甚至可能是其他合理的东西)?
这些常见或已知的模式是否有命名可以引用它们?也就是说,如果我试着将这篇文章的标题问题改写为"模式A和B之间有什么区别," A和B会是什么?
答案 0 :(得分:1)
第一个代码段未声明ShopScript
,这不是一件好事。如果您在全球范围内,则可以使用var
:
if (typeof ShopScript === 'undefined') {
var ShopScript = {};
}
但是由于var
没有块范围(这就是在这里使用它的重点),所以不需要使用typeof
来检查不确定性:
var ShopScript;
if (ShopScript === undefined) {
ShopScript = {};
}
如果您不在全局范围内,那么您需要以某种方式引用全局对象以向其添加属性(window
,例如,在浏览器中):
if (typeof ShopScript === 'undefined') {
window.ShopScript = {};
}
但在那时你也可以用它来检查;这里真的没什么区别:
if (window.ShopScript === undefined) {
window.ShopScript = {};
}
这也是你使用||
获得第二个代码段的方式,如果window.ShopScript
是假的,而不是特别是undefined
,那么测试除外。对于添加全局“命名空间”对象的情况,这很少重要。
回答(2),是的,在严格模式之外分配一个未声明的变量会将它放在全局对象上。在严格模式下,它会抛出错误,您应该使用严格模式。
*它还无条件地重新分配ShopScript
,如果ShopScript
被定义为具有自定义描述符的属性,则仅具有可见效果。这种情况也很少发生。