问题描述
我正在努力提高我对 javascript 中全局命名空间的理解,我对以下几点感到好奇:
是否有一个GOD"(即父)对象,所有对象(因为除了原始对象之外的所有事物都是对象)都可以回答,如果有,该对象是否会是窗口"?
李>为什么在全局级别上有变量/函数是个坏主意?
如果在全局范围内拥有变量/函数真的是个坏主意,那么闭包是避免这种情况的最佳方法吗?示例:
函数父(){var x = 'some value';//这个 var 将被认为对所有子函数都是全局的,但不在真正的全局命名空间中函数 child1(){x.someMethod()}功能孩子2(){x*某事;}函数 child3(){x+=某事;孩子2()孩子1()}孩子3()}父母()
是否有一个神(即父母)对象?
是的. 从技术上讲,它是所有这些原语的成员的全局对象;只是碰巧在浏览器中,
window
对象是 全局对象.>window.String === 字符串;真的
为什么在全局级别上有变量/函数是个坏主意?
因为如果您要添加大量第 3 方库/脚本,它们都共享同一个全局对象,因此可能会发生名称冲突.这是所有使用
$
作为别名的库(jQuery、Prototype 等)的现实问题.如果在全局范围内拥有变量/函数真的是个坏主意,那么闭包是避免这种情况的最佳方法吗?
x
不应被视为全局.它是通过在parent()
函数中声明子函数而形成的闭包的一部分.您的代码段的 problem 部分是parent()
是全局的;如果其他代码重新声明parent()
会发生什么?这样会更好:(function () {函数父(){var x = '某个值';函数 child1(){x.someMethod()}功能孩子2(){x*某事;}函数 child3(){x+=某事;孩子2()孩子1()}孩子3()}父母()}());
x
可以在子函数中访问这一事实还不错;你应该自己编写这些函数,所以你应该意识到x
的存在.请记住,如果您在这些子函数中使用var
重新声明x
,则不会影响parent 中的
.x
()
I'm trying to improve my understanding of the global namespace in javascript and I'm curious about a few things:
is there a "GOD" (i.e. a parent) object that all objects (since all things except primitives are objects) to answer to and if so would that object be "window" ?
why is it bad idea to have vars/functions on a global level?
if it is really a bad idea to have vars/functions in global scope then would closures be the best way to avoid this? example:
function parent(){ var x = 'some value';//this var would be considered global to all children functions but not in the true global namespace function child1(){ x.someMethod() } function child2(){ x*something; } function child3(){ x+=something; child2() child1() } child3() } parent()
Yes. More technically, it's the global object that all these primitives are members of; it just happens that in the browser, the
window
object is the global object.> window.String === String; true
Because if you're adding lots of 3rd party libraries/ scripts, they all share the same global object, there's the chance of name collisions. This is a real life problem with all the libraries which use
$
as an alias (jQuery, Prototype and more).x
shouldn't be considered global. It's part of the closure formed by declaring the child functions inside theparent()
function. The problem part of your snippet is thatparent()
is global; what happens if some other code re-declaredparent()
? This would be better:(function () { function parent(){ var x = 'some value'; function child1(){ x.someMethod() } function child2(){ x*something; } function child3(){ x+=something; child2() child1() } child3() } parent() }());
The fact
x
is accessible within the child functions isn't bad; you should have written those functions yourself, so you should be aware of the existence ofx
. Bear in mind that if you re-declarex
within those child functions withvar
, you won't affect thex
inparent()
.
这篇关于了解 javascript 全局命名空间和闭包的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!