试图理解两个简短的JavaScript函数中的范围

时间:2017-01-15 05:49:53

标签: javascript performance javascript-objects

以下两个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;
}

4 个答案:

答案 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;中,您将每个参数分配给变量,并且此变量仅在函数内部具有范围