ECMAScript/JS 基础知识讲解

闭包

下面这个方法能输入0 1 2 ... 9吗?显然是不可以的,输出结果是10个10。

function test() 
{
	var arr = [];
	for(var i = 0; i < 10; i++)
	{
		arr[i] = function() {
			console.log(i);
		}
	}
	return arr;
}
var arrs = test();
for(var j = 0; j < arrs.length; j++) {
	arrs[j]();
}

  利用立即执行函数把0到9输出。这种写法没什么意义,还不如直接写个for循环

function test() 
{
	var arr = [];
	for(var i = 0; i < 10; i++)
	{
		(function()
		{
			console.log(i)
		}(i))
	}
}
var arrs = test();

  下面这种写法能看懂不,反正我是想不出来的

function test() 
{
	var arr = [];
	for(var i = 0; i < 10; i++)
	{
		(function(j){
			arr[j] = function() {
			console.log(j);
		}
		}(i))
	}
	return arr;
}
var arrs = test();
for(var j = 0; j < arrs.length; j++) {
	arrs[j]();
}

  闭包的应用3:可以实现封装,属性私有化

说明:prepareWife不属于Deng的属性,但是能够被方法访问。

//闭包的应用:可以实现封装,属性私有化
function Deng(name, wife) {
	var prepareWife = "xiaozhang";
	this.name = name;
	this.wife = wife;
	this.divorce = function() {
		this.wife = prepareWife;
	}
	this.changePrepareWife = function (target) {
		prepareWife = target;
	}
	this.sayPrepareWife = function() {
		console.log(prepareWife);
	}
}
var deng = new Deng('deng', 'xiaoliu');

  this指向

说明:结果是222,最后执行fun()没有对象调用所以是window的name.

var name = "222";
var a = {
	name : "111",
	say : function() {
		console.log(this.name);
	}
}
var b = {
	name : "333",
	say : function(fun) {
		// this --> b
		// fun没有对象调用,所以是window(GO)
		fun();
	}
}
b.say(a.say);//222
b.say = a.say;
b.say();//333 

  

   深度克隆 

// 1.判断是不是原始值 typeof() object
// 2.判读是数组还是对象 instanceof toString constructor
// 3.建立相应的数组或对象(递归)
var obj = {
	name : "abc",
	age : 14,
	card : ['visa', 'master'],
	wife : {
		name : "abcd",
		son : {
			name : "aaa"
		}
	}
}
var obj1 = {}
function deepClone(origin, target){
	var target = target || {},
		toStr = Object.prototype.toString,
		arrStr = "[object Array]";
	for(var prop in origin) {
		if(origin.hasOwnProperty(prop)) {
			if(typeof(origin[prop] == 'object')) {
				if(toStr.call(origin[prop]) == arrStr){
					target[prop] = [];
				}else{
					target[prop] = {};
				}

				deepClone(origin[prop], target[prop]);

			}else{
				target[prop] = origin[prop];
			}
		}
	}

}
deepClone(obj, obj1);

  

 

posted @ 2017-10-13 21:59  初级编程  阅读(363)  评论(0编辑  收藏  举报