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

Sur*_*raj 5 javascript performance javascript-objects

以下两个JavaScript函数有什么区别?我知道用var声明的变量在函数内部是局部的,如果使用this`关键字声明,则暴露给外部单词.之间有什么区别吗?

function student(param1, param2, param3) {
    this.name = param1;
    this.age = param2;
    this.address = param3;
}
Run Code Online (Sandbox Code Playgroud)

function student(param1, param2, param3) {
    var name = param1;
    var age = param2;
    var address = param3;
}
Run Code Online (Sandbox Code Playgroud)

Gan*_*rer 3

简短的回答:您将使用第一个作为构造函数。第二个函数什么也不做。如果您想使用“私有变量”,请通过闭包通过实例方法引用构造函数中的函数作用域变量。

该函数将按以下方式使用来创建学生。传入的参数被分配给新创建的学生对象。

	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'
Run Code Online (Sandbox Code Playgroud)

第二个不能满足构造函数。

它声明具有未使用的功能范围的变量。一旦函数执行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
Run Code Online (Sandbox Code Playgroud)

编辑

有人提出了如何使用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());
Run Code Online (Sandbox Code Playgroud)

请注意,因为实例方法getName引用构造函数中声明的函数作用域变量,所以仍保留引用这些变量的闭包。由于闭包,一旦构造函数结束,仍然存在对变量的引用,并且它们不会被垃圾收集。因此,通过实例方法,您可以获取和设置此变量,该变量无法通过构造函数的结果对象访问。