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