var obj = { name : ["Dean Edwards", "Sam Stephenson", "Alex Russell", "Dean Tom"] }; function addMethod(obj , name , fn){ var old2 = obj[name]; obj[name] = function(){ if(fn.length == arguments.length){ return fn.apply(this , arguments); } else if(typeof old2 === 'function'){ console.log(old2 == obj[name]); //这里为什么是不相等的呢? return old2.apply(this , arguments); } }; } addMethod(obj , "find" , function(){ return this.name; }); addMethod(obj , "find" , function(firstname){ var ret = []; for(var i = 0 ; i < this.name.length; i++){ if(this.name[i].indexOf(firstname) === 0){ ret.push(this.name[i]); } } return ret; }); addMethod(obj , "find" , function(firstname , lastname){ var ret = []; for(var i = 0 ; i < this.name.length; i++){ if(this.name[i] === firstname + " " + lastname){ return ret.push(this.name[i]); } } return ret; }); console.log(obj.find()); console.log(obj.find('Dean')); console.log(obj.find('Dean','Edwards'));old2.apply(this , arguments);请问这段代码是怎么理解的呢,以及方法绑定的链条是怎么样的呢?请各位大神解答一下,谢谢啦!为什么可以向上调用old指向的上个方法。
1 回答
已采纳
橋本奈奈未
TA贡献436条经验 获得超108个赞
闭包。挺复杂的,看起来真费劲。
old2是上次添加进来的function,apply方法是使用指定的上下文对象调用该函数。逻辑大概是这样的:
find()调用;
执行最后一次添加的匿名函数即两个参数的那个;
fn.length指的是该函数有多少个必须要传入的参数,即形参的个数。arguments是实际传入的参数。2!=0;
执行old2并指定其上下文为obj,old2因为闭包指向的是上一次添加的函数引用。即执行第二次添加的函数。重复上个步骤。
添加回答
举报
0/150
提交
取消