代码段1:
function Person(firstName, lastName, age)
{
//私有变量:
var _firstName = firstName;
var _lastName = lastName; //公共变量:
this.age = age; //方法:
this.getName = function()
{
return(firstName + " " + lastName);
};
this.SayHello = function()
{
alert("Hello, I'm " + firstName + " " + lastName);
};
};
var BillGates = new Person("Bill", "Gates", 53);
var SteveJobs = new Person("Steve", "Jobs", 53);
BillGates.SayHello();
SteveJobs.SayHello();
alert(BillGates.getName() + " " + BillGates.age);
alert(BillGates.firstName); //这里不能访问到私有变量书上说上面是一个闭包,我怎么感觉上面的红色部分变量使用带下划线的变量代替才是闭包呢。
就像下面这样
function Person(firstName, lastName, age)
{
//私有变量:
var _firstName = firstName;
var _lastName = lastName; //公共变量:
this.age = age; //方法:
this.getName = function()
{
return( _firstName + " " + _lastName);
};
this.SayHello = function()
{
alert("Hello, I'm " + _firstName + " " + _lastName);
};
};
var BillGates = new Person("Bill", "Gates", 53);
var SteveJobs = new Person("Steve", "Jobs", 53);
BillGates.SayHello();
SteveJobs.SayHello();
alert(BillGates.getName() + " " + BillGates.age);
alert(BillGates._firstName); //这里不能访问到私有变量到底哪一种方式属于闭包?
function Person(firstName, lastName, age)
{
//私有变量:
var _firstName = firstName;
var _lastName = lastName; //公共变量:
this.age = age; //方法:
this.getName = function()
{
return(firstName + " " + lastName);
};
this.SayHello = function()
{
alert("Hello, I'm " + firstName + " " + lastName);
};
};
var BillGates = new Person("Bill", "Gates", 53);
var SteveJobs = new Person("Steve", "Jobs", 53);
BillGates.SayHello();
SteveJobs.SayHello();
alert(BillGates.getName() + " " + BillGates.age);
alert(BillGates.firstName); //这里不能访问到私有变量书上说上面是一个闭包,我怎么感觉上面的红色部分变量使用带下划线的变量代替才是闭包呢。
就像下面这样
function Person(firstName, lastName, age)
{
//私有变量:
var _firstName = firstName;
var _lastName = lastName; //公共变量:
this.age = age; //方法:
this.getName = function()
{
return( _firstName + " " + _lastName);
};
this.SayHello = function()
{
alert("Hello, I'm " + _firstName + " " + _lastName);
};
};
var BillGates = new Person("Bill", "Gates", 53);
var SteveJobs = new Person("Steve", "Jobs", 53);
BillGates.SayHello();
SteveJobs.SayHello();
alert(BillGates.getName() + " " + BillGates.age);
alert(BillGates._firstName); //这里不能访问到私有变量到底哪一种方式属于闭包?
而所谓的访问不到firstname是作用域的范畴
var firstName=firstName//当firstName以参数传递进来时相当于重新定义了一个firstName
}
所以firstName,_firstName只是两个同样效果的变量。所以产生的闭包也是一样的。
明白了,确实是两个效果是一样的,都是没有把变量释放掉。
还有个小疑问:
alert(BillGates._firstName); //这里应该才算私有变量吧?
alert(BillGates.firstName); //这里应该算作用域的问题吧?我对其它语言不太熟悉,请问各位其它语言有闭包机制吗?
如果有,他们是怎样避免闭包导致的内存泄露问题的?
闭包的最佳判断标准是有未释放的自由变量.但其实各语言的闭包都是有一个前提.他们必需支持一级函数(first-class function).
在这个条件下的,语言寻找scope chain中的自由变量时才有可能调用到未释放的自由变量.所以,闭包问题本来也就是作用域的问题.