js高程学习笔记

循环里面的匿名函数取得的任何变量都是最后一个值

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());



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值