🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
~~~javascript 1.function fun(){ 2. this.a=10; 3. this.b=function(){ 4. alert(this.a); 5. } 6.} 7.fun.prototype={ 8. b:function(){ 9. this.a=20; 10. alert(this.a); 11. }, 12. c:function(){ 13. this.a=30; 14. alert(this.a) 15. } 16.} 17.var my_fun=new fun(); 18.my_fun.b();// 10 19.my_fun.c(); //30 ~~~ ~~~ var n = 2; function a() { var n = 3; // 私有的变量 function b(m) { alert(++n + m); } b(4); return b; } var c = a(5); c(6); alert(n); ~~~ ![](https://img.kancloud.cn/0b/bd/0bbda84f916b51d7559c0173ba03b973_424x237.png) **当前作用域的上级作用域就是:当前函数在哪个作用域创建的,和在哪里执行的没有关系。** ![](https://img.kancloud.cn/c9/8d/c98d8dac00566175c3a1510dd7f81fd4_2320x942.png) ### 10.谈一下你对作用域链和原型链的理解 `作用域链` 函数执行会形成一个私有的作用域,形参和在当前私有作用域中声明的变量都是私有变量,当前的私有作用域有自我保护机制,私有变量和外界是没有关系的,但是如果私有作用域中遇到一个非私有的变量,则向它的上级作用域找,如果还不是上级作用域私有的,则继续向上查找,一直找到window为止。这种变量一层层向上查找的机制就是“作用域链机制” `原型链` 它也是一种查找机制,实例首先在自己的私有属性中进行属性的查找,如果不是私有属性,基于__proto__ 向所属类的原型上进行查找,如果在找不到,则继续基于__proto__ 向上查找,一直找到Object.prototype为止,例如:obj.hasOwnProperty() 这里调取的hasOwnProperty这个属性就是找到Object.prototype才找到的 11. 实现 一个$attr(domId,name,value)遍历id是domId的,内部属性为name且值为value的元素? ~~~ <!--<div name="teacher">张三</div> <div id="AA"><div>李四</div></div> <div>王五</div> <div>赵六</div> <div name="hobby" id="hobbyBox">music</div> <input name="hobby" id="hobbyBox" value="music"/>--> let $attr = (domID, name, value) => { //1.先获取当前页面中所有的标签 let tagList = document.getElementsByTagName('*'); //2.在获取的所有标签中按照ID/NAME/VALUE进行筛选(数组内置方法:filter) tagList = [].slice.call(tagList);//=>把类数组转换为数组 //=> tagList=[...tagList] 基于ES6中的展开运算符完成,让TAG-LIST等于一个数组, // 数组中的每一项是把之前的类数组展开后得到的 tagList = tagList.filter(item => { //=>item.name:只有表单元素这样才可以获取到值,普通元素需要基于getAttribute获取值 // return item.id === domID && item.getAttribute('name') === name && (item.innerHTML === value || item.value === value); // =>传统标签获取里面的内容不是基于VALUE属性,而是基于INNER-HTML/INNER-TEXT属性完成的 return item.id === domID && item.getAttribute(name) === value; }); return tagList; }; console.log($attr('hobbyBox', 'hobby', 'music')); // let ary = [12, 23, 34, 25, 36, 47]; // ary = ary.filter((item, index) => { // return item > 20 && item < 40;//=>返回的结果是TRUE或者FALSE, // 返回的是TRUE会把这一项存放到新数组中(基于FILTER不会修改原有的数组,会把遍历后符合条件的放到新数组中) // }); //=>扩展:获取当前页面中所有ID重复的元素 ~~~