为什么当我将变量复制到窗口对象时它变为公共?

时间:2014-12-03 16:59:07

标签: javascript function variables scope global-variables

无论范围如何,如果我创建一个变量然后将其传递给(克隆)窗口对象,它就会变为公共。一段代码说了千言万语:

(function(){
  var notCloned = false,
      toClone   = true;
  window.toClone = toClone;
}());

在这种情况下,我可以访问toClonewindow.toClone但不能访问notCloned。 此外,我注意到它们以某种方式绑定,因为您应用的任何更改都会影响另一个,例如:

window.toClone = false;
console.log(toClone); // It changes to false, too

任何人都可以解释为什么以及如何将toClone保留为私有(超出全局范围)变量?

提前致谢。

2 个答案:

答案 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属性的内容都将在您的脚本中无处不在