以下两个JavaScript函数有什么区别?我知道用var声明的变量在函数内部是局部的,如果用声明,则此`关键字暴露给外部单词。
function student(param1, param2, param3) {
this.name = param1;
this.age = param2;
this.address = param3;
}
和
function student(param1, param2, param3) {
var name = param1;
var age = param2;
var address = param3;
}
答案 0 :(得分:3)
简短回答:您可以将第一个用于构造函数。第二个功能什么也没做。如果要使用“私有变量”,请通过闭包通过实例方法在contstructor中引用功能范围变量。
此功能将按以下方式用于创建学生。传入的参数将分配给新创建的学生对象。
function student(param1, param2, param3){
this.name = param1;
this.age = param2;
this.address = param3;
}
var student1 = new student('steve', 22,'333 E 3rd Ave');
var student2 = new student('rachel', 34,'111 N 1st St');
console.log(student1.name); // 'steve'
console.log(student2.name); // 'rachel'
第二个不满足构造函数。
它声明具有未使用功能范围的变量。一旦student
函数的执行结束,其中定义的3个变量将被垃圾收集。这个功能似乎没有任何成就。
您对此功能的期望是什么?它不能以相同的方式使用:
function student(param1, param2, param3){
var name = param1;
var age = param2;
var address = param3;
}
var badStudent = new student('Greg', 22,'222 W 2nd Rd');
console.log(badStudent.name); // undefined
修改强>
有人提出了如何使用构造函数中使用var
声明的变量来创建“私有成员变量”。使用闭包:
function student(param1, param2, param3) {
var name = param1;
var age = param2;
var address = param3;
this.getName = function(newName) {
if (newName)
name = newName;
return name;
};
}
var myStudent = new student('steve', 22,'333 E 3rd Ave');
console.log(myStudent.name);
console.log(myStudent.getName());
console.log(myStudent.getName('dan'));
console.log(myStudent.getName());
请注意,因为实例方法getName
引用了构造函数中声明的功能范围变量,所以仍然会引用具有引用这些变量的闭包。由于闭包,一旦构造函数结束,仍然会引用变量,并且它们不会被垃圾收集。因此,通过实例方法,您可以获取并设置此变量,该变量无法通过构造函数的结果对象进行访问。
答案 1 :(得分:1)
this.
与var
变量之间的基本区别在于范围。声明为this
一部分的变量将成为对象的一部分,使用var
声明的变量可能是私有的。 Might
因为,这取决于您的return
。如果您不使用return
,那么它们将是私有的
function Student(fname, lname, dob) {
var _fname = fname,
_lname = lname,
_dob = new Date(dob);
this.fullName = _fname + " " + _lname;
this.age = (new Date()).getFullYear() - _dob.getFullYear();
}
var stu = new Student('foo', 'bar', '1998/11/13');
console.log(stu);
console.log(stu._fname)

如您所见,_fname
已通过并使用var
存储。所以它的范围仅限于功能。因此,当您尝试在函数外部访问它时,它不可用。
因此,简单来说,您可以使用this
来定义公共属性,并使用var
来定义私有属性。
答案 2 :(得分:1)
在用于创建对象的JavaScript中,我们使用'function'作为构造函数,这个构造函数基本上返回一个对象。 当你使用'var'时刻'this.var name'声明变量时,在这种情况下意味着你尝试使用那些变量来创建一个对象。用'var'声明的变量只是函数内的局部变量。
另一方面,当你使用'this.variableName'时,你会为构造函数尝试创建它的对象创建一个属性。
'这个'。引用构造函数创建的对象。 'var variableName'只是一个局部变量,它不是'this'对象的属性。
function student(param1,param2,param3){
this.name=param1;
this.age=param2;
this.address=param3;
}
var t=new student('farhad',28,'address');
将创建此对象:
t{
name:'farhad',
age:28,
address:'address'
}
和
function student2(param1,param2,param3){
var name=param1;
var age=param2;
var address=param3;
}
var t2=new student2('farhad',28,'address');
将创建此对象:
t2{
}
在't2'中你没有看到任何属性
答案 3 :(得分:0)
this
在函数内部使用,它包含调用函数
这里this
指的是对象&的实例。在对象调用定义它的函数之前,不会为其分配值
function Student(param1, param2, param3) {
this.name = param1;
this.age = param2;
this.address = param3;
this.print = function() {
console.log(this.name + this.age + this.address)
}
}
var stud = new Student('a', 'b', 'c');
stud.print(); // abc
在后面的情况var name=param1;var age=param2;var address=param3;
中,您将每个参数分配给变量,并且此变量仅在函数内部具有范围