为什么 Javascript 小书签要用闭包包裹?
为什么 Javascript 小书签包含在闭包中?
我不认为有人会无缘无故地把一个未命名的函数放在那里。
我已经阅读了很多关于闭包的解释,但我仍然不觉得我已经掌握了整个概念。
谢谢你们!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
为什么 Javascript 小书签包含在闭包中?
我不认为有人会无缘无故地把一个未命名的函数放在那里。
我已经阅读了很多关于闭包的解释,但我仍然不觉得我已经掌握了整个概念。
谢谢你们!
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(6)
创建后执行函数不会污染全局范围。
To not contaminate the global scope by executing a function after creation.
这可以防止小书签中的变量泄漏到页面中。
This prevents variables in the bookmarklet from leaking into the page.
两个原因:
污染
第一个原因是为了防止小书签所需的任何变量的全局污染。使用闭包意味着
var a
不会将window.a
添加到全局上下文。此外,使用命名函数会将其添加到全局命名空间中。function a() {...}
将添加window.a
。意外的 DOM 重建
第二个是避免通过返回字符串意外地重新创建 DOM。任何返回字符串的
javascript:
url 都将使用该字符串的内容作为源创建一个全新的 DOM。Two reasons:
contamination
The first is for preventing global contamination for any of the variables needed for the bookmarklet. Using a closure means that
var a
wont addwindow.a
to the global context. Additionally, using a named function would add it to the global namespace.function a() {...}
would addwindow.a
.accidental DOM recreation
The second is to avoid accidentally recreating the DOM by returning a string. Any
javascript:
url where a string is returned will create a brand new DOM using the contents of the string as the source.因为制作它们的人是网络的好公民 :) 并且不想意外地跳过实际页面的 JavaScript。
Because the folks who are making them are good citizens of the web :) and don't want to step over the actual page's JavaScript accidentally.
范围冲突和退货政策的混合体。
zzzzBov 在该帖子中的回答简洁地涵盖了主要问题。
A mixture of scope conflicts and return policy.
zzzzBov's answer in this thread covers the main issues succinctly.
它通常是为了避免污染全局命名空间,也称为模块模式,如 Ben Cherry 所描述的: http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth
It's generally to avoid polluting the global namespace, it's also known as the Module Pattern as described by Ben Cherry: http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth