javascript - 一个带参数但构造函数体内没有 "vars"的对象构造函数,数据在哪?

标签 javascript parameters constructor attributes closures

参数提供的数据存储在哪里? 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);//引用错误,first 未定义

console.log(myStudent.first);//未定义

for(myStudent 中的变量 x){ 控制台日志(x); //获取第一个

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

What happens with "var" variables inside a JavaScript Constructor?

“var” variables, "this" variables and "global" variables - inside a JavaScript Constructor

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

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

最佳答案

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 中实现“私有(private)”变量,即从外部无法访问闭包中捕获的值。

正因为如此,事实证明闭包是捕获其范围内的所有变量还是仅捕获它使用的变量并不重要,因为无论如何您都无法“深入”那些封闭的变量。 (虽然在实践中通常只捕获使用过的值,以便运行时可以垃圾收集其余部分,因为它们是不需要的。)

关于javascript - 一个带参数但构造函数体内没有 "vars"的对象构造函数,数据在哪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13150375/

相关文章:

javascript - 无法从表单获取值?

javascript - 如何使用jQuery获取多个单选按钮组的值

c# - 如何在 C# 中将特定参数标记为过时/弃用?

java - 继承的构造函数java : Call to super() must be first statement

java - 在调用父类(super class)构造函数之前验证构造函数的参数

javascript - JavaScript 中的构造函数

javascript - 情节线后的 Highcharts 标记

javascript - 韩语罗马字 : it does not get everything romanized

c++ - 将函数用作非类型模板参数时出错

ruby-on-rails - 具有嵌套 fields_for 的表单,可保存到多条记录