循环里面的匿名函数取得的任何变量都是最后一个值
function box(){
var arr = [];
for(var i=0;i<5;i++){
arr[i] = function(){
return i;
}
}
return arr;
}
var b = box();
for(var i=0; i<5; i++){
alert(b[i]());//all 5
}
改成立即执行并且传参
function box(){
var arr = [];
for(var i=0;i<5;i++){
arr[i] = (function(){
return i;
})(i);
}
return arr;
}
var b = box();
for(var i=0; i<5; i++){
alert(b[i]);//0~4
}
或者匿名函数下再写个匿名函数
function box(){
var arr = [];
for(var i=0;i<5;i++){
arr[i] = (function(num){
return function(){
return num;
}
}
)(i);
}
return arr;
}
var b = box();
for(var i=0; i<5; i++){
alert(b[i]());//0~4
}
this对象
var user = "the window";
var obj = {
user: "the object",
getUser:function(){
return function(){
return this.user;
}
}
}
alert(obj.getUser()());//the window
alert(obj.getUser().call(obj));//the object 强制指向某个对象
//或者从上一个作用域中得到对象
var user = "the window";
var obj = {
user: "the object",
getUser:function(){
var that = this;
return function(){
return that.user;
}
}
}
alert(obj.getUser()());//the object
内存泄露
function box(){
var myDiv = document.getElementById("div");
myDiv.onclick = function(){
alert(myDiv.id); // myDiv 用完后常驻内存
}
}
function box(){
var myDiv = document.getElementById("div");
var id = myDiv.id;
myDiv.onclick = function(){
alert(id);
}
myDiv = null; // 解除引用,否则只有等到浏览器关闭才能释放
}
javascript 中没有私有属性,所有对象属性都是公有的,但是有私有变量,在函数内部定义的变量,在函数外部都不能访问,可以利用闭包创建访问私有变量的公有方法
function Box(){
var name = 24; // 私有变量
function run(){ // 私有函数
return "运行中!";
};
this.getName = function(){
return name+run();
}
}
var b = new Box();
alert(b.getName());
通过构造方法传参来访问私有变量
function Box(value){
var user = value;
this.setName = function(value){
name = value;
};
this.getName = function(){
return name;
}
}
var b = new Box("jack");
alert(b.getName());
静态私有变量,通过块级作用域(私有作用域)
(function(){
var age = 24;
function run(){
return "运行中";
}
Box = function(){
}
Box.prototype.getAge = function(){
return age + run();
}
})();
var b = new Box();
alert(b.getAge());
模块模式:采用字面两方式创建对象
var box = function(){
var age = 100;
function run(){
return "运行中";
}
return {
go:function(){
return age + run();
}
}
}(); // 单例模式
alert(box.go());
增强的模块模式:用于创建自定义对象
function Desk(){
}
var box = function(){
var age = 100;
function run(){
return "运行中";
}
var desk = new Desk();
desk.go = function(){
return age+ run();
}
return desk
}(); // 单例模式
alert(box.go());