无论范围如何,如果我创建一个变量然后将其传递给(克隆)窗口对象,它就会变为公共。一段代码说了千言万语:
(function(){
var notCloned = false,
toClone = true;
window.toClone = toClone;
}());
在这种情况下,我可以访问toClone
,window.toClone
但不能访问notCloned
。
此外,我注意到它们以某种方式绑定,因为您应用的任何更改都会影响另一个,例如:
window.toClone = false;
console.log(toClone); // It changes to false, too
任何人都可以解释为什么以及如何将toClone
保留为私有(超出全局范围)变量?
提前致谢。
答案 0 :(得分:2)
您在console.log
语句中引用全局变量。
试试这个:
(function(){
var notCloned = false,
toClone = true;
window.toClone = toClone;
window.whatsClone = function() { return toClone; }
}());
window.toClone = false;
console.log(toClone); // Will print false because actually is getting from the scope of global window
console.log(whatsClone()); // Will print true
whatsClone()
将获得正确的范围变量。
我创建了快速JSBin fiddle
另请注意,Primitives(String,Number,Boolean)未被引用,它们被复制,基本上是这样的:
foo = true;
window.bar = foo;
window.bar
不会是对foo
的引用,它只是布尔值的副本。
答案 1 :(得分:0)
window
是一个对象,它也是所有函数的初始“上下文”。
如果您在不使用范围更改模式的情况下在JavaScript中编写代码,i。即bind()
,apply()
或类,您的默认范围为window
。任何未使用var
关键字定义或明确设置为window
属性的内容都将在您的脚本中无处不在。