“var”变量,“this”变量和“global”变量 - 在JavaScript构造函数中
“var” variables, "this" variables and "global" variables - inside a JavaScript Constructor
在我的最后一个问题之后,这个对我来说更准确:
例:
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("foo"...) 的每个实例,内存中都会保存一个包含这个"私有"变量的 Foo 承包商函数。 或者它会与私有变量的位置相同 Foo 函数 - 对于 Foo 的所有实例(如"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
,然后foo中的x
相当于你在foo中的blablabla
。 这是一个非常粗略的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
创造了一个闭包。 有趣的是,编译器可能会看到 blabla 永远不会被写入并优化this.getblabla
以始终返回 10 并且从不保存闭包范围。 当您中断闭包内函数的执行并尝试读取它内部未引用的值时,可以看到这一点。
如果调用以下任一操作,关闭范围将被释放并排队等待垃圾回收:
delete foo.getblabla;
foo.getblabla = "Anything!";
foo = "Anything else.";
是的,你明白了!
至于问题的第二部分,它完全是关于继承的,就像(全局)窗口与其作用域中定义的函数之间的关系(想想根)。 所以你没有重新指定的一切,都会被祖先查到。
这是克罗克福德的一个非常好的视频,他很好地解释了它。
- 调用类向后变量 (JavaScript)
- 初始化父类中的变量(JavaScript/CoffeeScript 习语)
- 可以'找不到变量javascript错误
- 输出数组变量javascript
- 自提交表单访问变量javascript
- 将变量 javascript 添加到用于旋转图像的链接中
- 在文本字段中显示保存的本地存储变量 - javascript
- 将变量添加到变量 JavaScript 中
- 获取要在变量 JavaScript 中使用的用户输入值
- 如何在变量 Javascript 中删除双引号
- 使用变量 javascript 从 json 文件中获取数据
- 读取输入和打印变量 - JavaScript 和 HTML 4.01
- 传递 PHP 变量 JavaScript 窗口位置
- 重置变量 JavaScript
- 变量 JavaScript 中的变量
- 尝试使用多个函数时无法使用全局变量 - JavaScript - 初学者
- 如何按值将数组分配给另一个变量 JavaScript
- setTimout 搞砸了变量 JavaScript
- 用内部函数变量更改外部函数变量?Javascript
- 根据变量 JavaScript 增加