gpt4 book ai didi

javascript - “leaking” 进入全局范围是什么意思?

转载 作者:可可西里 更新时间:2023-11-01 01:18:55 26 4
gpt4 key购买 nike

不久前,我提供了一个 JavaScript 设计模式(模块模式 - 见下文),它是我从 John Resig 的例子中得到的 part of a solution to someone’s question我收到了以下评论:

“…that pattern is a bit over engineered and not that good. Still leaking into global-scope. and your not opening yourself to async loaders. But it is better then just ad-hoc coding !”

所以……

如果“泄漏”到全局范围意味着“您的对象被附加到浏览器窗口(对象)”......那么一切都已经被附加(全局):

这会“泄漏”到全局范围内:

window.jQuery

...只需调用:window.jQuery 并将其解析为 function();

这会“泄漏”到全局范围内:

function HelloWorld() { alert(‘Howdy’); }

...只需调用:window.HelloWorld(),您就会得到“Howdy”。

这会“泄漏”到全局范围内:

var myVariable = 10;

...只需调用:window.myVariable,您将得到 10

如果评论者是正确的,那么以上所有内容都会“泄漏”到全局范围内。因此,就我个人而言,我看不出有什么方法可以不“泄漏”到全局范围内,因为即使您的表单控件也存在于那里(也)。

因此,这是我的问题......

  • “渗入”是什么意思全局范围?
  • 为什么不好?
  • 你如何避免它?
  • 当想要创建持久化自定义对象,为什么是模块模式(下)不好?
  • 设计模式让你封装逻辑复杂,就是封装突然变坏只是因为我们用 JavaScript 编写
  • 或者...这个评论者完全错了吗?

这是我上面提到的模块模式:

<script type="text/javascript">
var myNamespace = (function($) {
var publicInstances = {};

// ***********************
// myObject
publicInstances.myObject = myObject;
function myObject() {

/// <summary>A pointer to this</summary>
var self = this;

this.someProperty = new String();

this.initialize = function() {
/// your code here
}
this.someMethod = function() {
/// your code here
}

self.initialize();
}

return publicInstances;
})(jQuery);


jQuery(document).ready(function() {
// Use would look like
var myInstance = new myNamespace.myObject();
});
</script>


更新:
我对下面的答案很满意,并感谢大家花时间发表评论。

回顾以下答案:
当在局部范围内使用的某些东西无意中可用于全局范围(例如 window 对象)时,就会“泄漏”到全局范围内。这很糟糕,因为它会打开页面以应对潜在的命名冲突,这可能会导致变量解析为意外的值或类型。

故意使变量成为全局变量不被视为“泄漏”。但是,需要正确命名对象以减少上述命名冲突的可能性。

您无法避免全局范围的变量,但您可以通过使用异步加载器和定义模块来降低上述风险,这些插件在插件中可用,例如 RequireJSCurl .

最佳答案

“泄漏”到全局范围是指在局部范围内使用的某些内容无意中可用于全局范围。这意味着分配给当前范围内尚 undefined variable :

function myFunction() {
a=1;
}

myFunction();
alert(a);
//-> 1

这很糟糕,因为可能存在命名冲突,导致变量的值/类型与预期不同。当您忘记为 for 语句中使用的变量使用 var 关键字时,它还会导致旧版 Internet Explorer 出现错误。

我不会将故意使变量成为全局变量归类为“泄漏”,因为它更像是您将其“注入(inject)”到全局范围内。然而,这仍然经常被一些人认为是不好的做法(尽管我认为这有点夸张),因为与 window 对象的当前属性或其他脚本和库设置的变量仍然存在潜在的命名冲突.

关于javascript - “leaking” 进入全局范围是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5951228/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com