Javascript 一种对象构造函数,它接受参数但没有;vars";在构造函数主体中,数据在哪里?

Javascript 一种对象构造函数,它接受参数但没有;vars";在构造函数主体中,数据在哪里?,javascript,parameters,constructor,attributes,closures,Javascript,Parameters,Constructor,Attributes,Closures,参数提供的数据存储在哪里?是否先隐式创建var function Student(first){ this.getFirst = function(){ return first; } } 通过以下方式进行测试: var myStudent=新学生(“罗斯”) console.log(myStudent)//学生{getFirst=function()} console.log(myStudent.getFirst())//罗斯 console.log(第一)//引用错误

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

function Student(first){
   this.getFirst = function(){
     return first;
   }
}
通过以下方式进行测试:

var myStudent=新学生(“罗斯”)

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

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

console.log(第一)//引用错误,第一个未定义

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

for(myStudent中的变量x){
控制台日志(x);
}
//getFirst

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

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


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

第一个
参数存储在作为构造函数的函数的本地,因此
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中的“私有”变量,因为闭包中捕获的值是外部无法访问的


因此,闭包是捕获其作用域中的所有变量还是仅捕获其使用的变量并不重要,因为您无论如何都无法“深入”到那些已关闭的变量。(虽然在实践中通常只捕获使用过的值,这样运行时就可以垃圾收集其余的值,因为它们是不需要的。)

要进一步了解您的要求,它不是关于创建
var
,而是在您的实例中,函数还保留
参数数组

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


闭包的魔力。

函数中的
var
关键字“创建”了一个变量,其作用域规则与函数的参数[变量]相同;反之亦然。那么,定义javascript构造函数而不在构造函数体中显式包含任何属性(具有getter/setter)是一种合法的编码策略吗?如果这样做,内存的使用是否与getter/setter分配给已声明属性的情况有所不同?不管怎样,都会关闭吗?如果是这样,那么属性的显式声明可能是浪费?无论您是通过名称将对象作为函数参数引用还是作为函数中的局部变量引用,您拥有的任何闭包都只是保留对同一对象的引用,而不是复制它。正因为如此,走哪条路都无关紧要。这很有趣:发送到构造函数(包括arguments集合)的每个参数都会被保留……抱歉用“活动”这个词,因为闭包引用了其中一个参数?或者说,参数集合是不是以某种方式缩减到只有那些引用了它们的元素?这有点太过分了。你现在指的是垃圾收集。当一个函数返回时,它的内部不再需要,所以整个过程都被标记为垃圾收集。如果仍然存在对其中一个变量/参数/函数的活动引用,则无法收集该引用。这是否意味着这些保存的变量保存在内存中,其他所有内容都被擦除,或者函数的整个范围是否保存在内存中,这取决于所讨论的JS引擎。