“VAR”变量“这个”变量和“全局”变量 - 内部JavaScript构造(“var” variab

2019-06-27 01:13发布

我的最后一个问题后,这个人是更准确的对我来说:

例:

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承包商功能。 还是会同样的富功能的地方私有变量-适用于所有情况下(如“富”)富的?

Answer 1:

只是把重点放在范围,我要通过这个例子之后运行,(更清晰的变量),我会回来将它连接到您的变量。

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可以运行看到这一点。



Answer 2:

你所说的一切都是正确的。 (当然,一个错误将在抛出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.";


Answer 3:

是的,你明白了吧!
至于问题的第二部分,它是所有关于继承,就像(全球)窗口,并在它的范围(认为根)定义的函数之间的关系。 所以,你不要再指定的一切,将在祖先中查找。

这是一个巨大的好视频由克罗克福德,谁解释了它真的很好。



文章来源: “var” variables, “this” variables and “global” variables - inside a JavaScript Constructor