我的最后一个问题后,这个人是更准确的对我来说:
例:
function Foo() {
this.bla = 1;
var blabla = 10;
blablabla = 100;
this.getblabla = function () {
return blabla; // exposes blabla outside
}
}
foo = new Foo();
我现在明白了:
this.bla = 1; // will become an attribute of every instance of FOO.
var blabla = 10; // will become a local variable of Foo(will **not** become an attribute of every instance of FOO), which could be accessed by any instance of FOO - only if there's a method like "this.getBlabla". that's a "closer" ?
blablabla = 100; // will define a **new** (or change if exist) global(window) variable.
难道我没有理解错?
还-如果我包括var blabla = 10;
和getblabla
使用它的承包商,然后美孚(“富” ......)的每个实例功能,也将被保存在包括这个“私有”变量存储一个Foo承包商功能。 还是会同样的富功能的地方私有变量-适用于所有情况下(如“富”)富的?
只是把重点放在范围,我要通过这个例子之后运行,(更清晰的变量),我会回来将它连接到您的变量。
var x = "Global scope";
var y = "Not changed.";
function Foo() {
this.x = "Attribute of foo";
var x = "In foo's closure";
y = "Changed!"
this.getX = function () {
return x;
}
}
// do some logging
console.log(x); // "Global scope"
console.log(y); // "Not changed"
foo = new Foo();
console.log(y); // "Changed!"
console.log(foo.x); // "Attribute of foo"
console.log(x); // "Global scope"
console.log(foo.getX()); // "In foo's closure"
行: this.x
相当于this.bla
,并且它定义了的外部可用的属性Foo
对象。 y
相当于blablabla=100
,然后将x
foo中相当于你blablabla
foo中。 这里是一个非常粗略的jsfiddle可以运行看到这一点。
你所说的一切都是正确的。 (当然,一个错误将在抛出blablabla
在分配严格模式 。
在下半年,有什么特别的构造函数。 它只是就像任何其他的功能,因为它创建了持续,只要其引用(的寿命封闭this.getblabla
在这种情况下)。
就拿这个例子:
function initBlaBla() {
var blabla = 10;
this.getblabla = function () {
return blabla; // exposes blabla outside
}
}
function Foo() {
this.bla = 1;
blablabla = 100;
initBlaBla.call(this);
}
foo = new Foo();
在这里, Foo
构造不形成封盖,其范围被立即释放。 initBlaBla
在另一方面创建一个封闭。 有趣的是,编译器可能会看到布拉布拉不会被写入和优化this.getblabla
总是返回10,从不保存关闭范围。 这可以当你在一个封闭的内部功能中断执行,并尝试阅读它没有内部参考的数值可以看出。
封闭范围将得到释放,并排队等待垃圾收集,如果你调用任何如下:
delete foo.getblabla;
foo.getblabla = "Anything!";
foo = "Anything else.";
是的,你明白了吧!
至于问题的第二部分,它是所有关于继承,就像(全球)窗口,并在它的范围(认为根)定义的函数之间的关系。 所以,你不要再指定的一切,将在祖先中查找。
这是一个巨大的好视频由克罗克福德,谁解释了它真的很好。
文章来源: “var” variables, “this” variables and “global” variables - inside a JavaScript Constructor