4

参数提供的数据存储在哪里?是var first隐式创建的吗?

function Student(first){
   this.getFirst = function(){
     return first;
   }
}

经测试:

var myStudent = new Student("ross");

console.log(myStudent);// 学生 { getFirst=function() }

console.log(myStudent.getFirst());// 罗斯

console.log(first);// 引用错误,首先没有定义

console.log(myStudent.first);// 不明确的

for(var x in myStudent){ console.log(x); }// 获取第一个

我的第二个问题是我是否正确理解这些:

JavaScript 构造函数中的“var”变量会发生什么?

“var”变量、“this”变量和“global”变量 - 在 JavaScript 构造函数中

...该getFirst函数是否创建一个闭包并保存构造函数参数值的状态,如果我var first在构造函数主体中使用 a 是否可以将其视为“封装”?此外,任何内部函数都将所有参数值保存在“关闭状态”中,还是只保存内部函数引用的参数值?

非常感谢您的想法。这是我关于 SO 的第一个问题,但几乎每天都使用该网站作为参考,所以谢谢你。我的编程知识有限,如果我使用了蹩脚的术语,请原谅,很高兴在需要的地方澄清。

4

2 回答 2

4

first参数在本地存储到作为构造函数的函数中,因此它内部的任何地方都Student()在范围内。

更有趣的是,您分配给的匿名内部函数正在this.getFirst关闭值。first因此,即使在构造函数完成执行后,内部函数也会保持对变量的引用。

这也适用于常规函数,而不仅仅是构造函数:

function makeCounter() {
   var count = 1;
   return function() { return count++; };
}

var counter = makeCounter();
console.log(counter());  // 1
console.log(counter());  // 2
console.log(counter());  // 3

如果使用得当,这种方法可用于在 JavaScript 中实现“私有”变量,因为闭包中捕获的值无法从外部访问。

正因为如此,结果证明闭包是捕获其范围内的所有变量还是仅捕获它使用的变量都无关紧要,因为无论如何您都无法“进入”这些封闭变量。(尽管在实践中通常只捕获使用的值,以便运行时可以垃圾收集其余的值,因为它们是不需要的。)

于 2012-10-31T02:37:09.303 回答
1

为了进一步了解您的要求,这不是关于创建 a var,而是在您的实例中,该函数还保留了arguments数组。

您的函数可以愉快地在两者上创建闭包。通过从您的函数返回函数,只要您不覆盖这些函数
,那些返回的函数(或具有作为方法的函数的对象)就可以访问任何和所有varsand 。arguments

闭包的魔力。

于 2012-10-31T03:33:36.563 回答