创建全局变量与JavaScript中的构造函数中的变量之间的区别

时间:2011-07-25 12:01:19

标签: javascript

如果我将全局变量x声明为:

var x = "I am window.x";

x将是window对象的公共属性。 如果我调用全局函数(不使用“call”,“apply”或首先将它附加到另一个对象),则窗口对象将作为上下文(“this”关键字)传入。 就像它在当前上下文中选择x属性一样,恰好是窗口。

但是,如果我在函数内部以相同的方式声明变量,则使用该函数作为构造函数,属性x将不是我刚刚构造的对象的公共属性(当前上下文)。我很高兴(我知道我可以这样做。= ...),但这看起来有点像矛盾。

我是否误解了某些事情(关于它是一种矛盾/不同的行为)?有人能够解释发生了什么,还是只是我必须接受的东西?

希望我的问题很明确。

3 个答案:

答案 0 :(得分:4)

答案 1 :(得分:0)

你在这个小提琴中有一些例子:

var x = 42;

function alertXs() {
    this.x = 'not 42'; // this = window
    var x = '42 not'; // local x

    alert('window.x = ' + window.x); // 'not 42'
    alert('this.x = ' + this.x);     // 'not 42'
    alert('x = ' + x);               // '42 not'

}

alertXs();

http://jsfiddle.net/Christophe/Pgk73/

有时,创造微小的小提琴有助于理解......

但是你很了解本地和公共变量,因为你很好地解释了......

答案 2 :(得分:0)

您对属性和构造函数的理解很好;你缺少的概念是'范围'和'封闭'。这是var发挥作用的地方。

尝试阅读Robert Nyman's explanation