JavaScript:函数中声明变量的两种方式的区别

3

我想创建一个对象。在我阅读的大部分代码中,他们经常使用这种方式:

function student(_id, _name, _year){
   this.id = _id;
   this.name = _name;
   this.year = _year;
}

但是,我不知道下面代码的区别:

function student (_id, _name, _year){
   var id = _id;
   var name = _name;
   var year = _year;
}

我已经测试了例如alert属性到屏幕上,但是没有发现区别。
谢谢 :)

2
第二个参数签名中的下划线是否有意省略? - Thilo
好的,第二个例子不起作用。"_id"、"_name"和"_year"未定义。 - Hamish
4个回答

3
当您使用 var 声明变量时,它们仅在函数/构造函数范围内可见。可以说它们是私有的。
在这种情况下,使用 this 与构造函数相得益彰。当您实例化一个学生时,分配给 this 的所有值都将是公开可访问的。
首先,我建议将您的 student 重命名为带有大写字母 SStudent。这是一种惯例,表示它是一个构造函数,您需要使用 new 关键字。
function Student(id, name, year){
   this.id = id;
   this.name = name;
   this.year = year;
}

如果您现在实例化一个学生,就可以访问值......
var student = new Student(1, "Name", 2012);
console.log(student.year); // => 2012

When using var you can't...

function Student (id, name, year){
   var id = id;
   var name = name;
   var year = year;
}

var student = new Student(1, "Name", 2012);
console.log(student.year); // => undefined

所以,为什么经常在使用this.property = property时,他们也会创建getter,尽管它的属性是公共的,而且还违反了面向对象编程原则。谢谢 :) - hqt
@hqt 如果你想限制属性的读写,你也可以创建getter和setter。你可以使用标准函数或在EcmaScript(JavaScript)的后续版本中使用内置的getter和setter来实现这一点。请参见有关getter和setter的以下问题。https://dev59.com/2E_Ta4cB1Zd3GeqPBHpe - Split Your Infinity

2
function student(_id, _name, _year){
   this.id = _id;
   this.name = _name;
   this.year = _year;
}
var s1 = new student(1, 'mike', 20);
console.log(s1.name); // give you mike

function student(_id, _name, _year){
   var id = _id;
   var name = _name;
   var year = _year;
}

var s1 = new student(1, 'mike', 20);
console.log(s1.name); // give you undefined

所以,为什么他们经常在使用 this.property = property 时,即使它的属性是公共的,也会创建 getter,并且更重要的是,这违反了面向对象编程原则。谢谢 :) - hqt
在JavaScript中,对象的每个属性都是公共的。 - xdazz
那么,他们为什么要创建getter,只是为了方便,对吧?看起来这违反了面向对象编程。 - hqt

2

这涉及到变量的作用域。

在你的第一个例子中,你将id、name和year分配为student的外部可访问属性。例如:

student.id, student.name, student.year

然而,在第二个例子中,这些变量的作用域仅限于student函数内部。您无法从外部访问它们的值。


2

第一个的区别在于属性是公共的,而第二个是私有的。

无论是否使用下划线作为前导变量没有区别。第二个示例中参数不匹配。id_id不同。


我可能有所误解,但在JS中是否有这样的东西?私有和公共变量?它们不只是属于不同的作用域吗? - Jonas G. Drange
1
@JonasG.Drange:将它们放在其他人看不到的范围内使它们成为私有的。 - Thilo
@Jonas 在 JavaScript 中并没有私有和公共的定义,但我们倾向于以面向对象的方式来思考它们。希望这样说得通。 - bingjie2680
这与作用域并没有真正关系。第一个示例创建了函数的this对象的属性,而第二个示例则将它们作为变量/执行对象的属性。此外,虽然在JavaScript中可以模拟公共和私有成员,但这并不是对这里发生的事情的好解释。 - RobG
@RobG,我完全同意你的观点,但我认为这是一种简单易懂的解释方式。 :) - bingjie2680

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接