JS基础面试题——作使用域及闭包
内容导读
这次主要使用例子解释一下什么是作使用域,什么是自由变量,什么是闭包,由于使用一句话概括实在是概括不出来,欢迎有大神可以一句话解释的在评论区评论一下,十分感谢。
这次主要使用例子解释一下什么是作使用域,什么是自由变量,什么是闭包,由于使用一句话概括实在是概括不出来,欢迎有大神可以一句话解释的在评论区评论一下,十分感谢。
1. 说一下变量提升的了解
以下两种情况下会进行变量提醒
- 变量定义
- 函数申明(要区分函数表达式和函数申明)
2. 说明this几种不同的用场景
- 在构造函数中用
- 作为对象属性时用
- 作为普通函数时用
- call,apply,bind
pre class=”brush:js;toolbar:false”>var a = { name: 'A', fun: function() { console.log(this.name); }};a.fun(); //this === aa.fun.call({ name: 'B' }); //this === { name: 'B' }var fun1 = a.fun;fun1(); //this === window
3. 创立10个a标签,点击每个弹出对应的序号
- 错误的例子:
pre class=”brush:js;toolbar:false”>// 在点击a标签时每个输出的都是10var i, a;for (i = 0; i < 10; i++) { a = document.createElement('a'); a.innerHTML = i + '
'; a.addEventListener('click', function(e) { e.preventDefault(); alert(i); //自由变量,会从父元素找i,点击时,其实i已经执行完变成了10 }); document.body.appendChild(a);}
- 用闭包改进的例子:
当然,在ES6中可以用let
pre class=”brush:js;toolbar:false”>var i;for (i = 0; i < 10; i++) { (function(i) { // 函数作使用域 var a = document.createElement('a'); a.innerHTML = i + '
'; a.addEventListener('click', function(e) { e.preventDefault(); alert(i); }); document.body.appendChild(a); })(i);}
4. 如何了解作使用域
- 自由变量
- 作使用域链,及自由变量的查找,找不到逐级向上找
- 闭包的两个场景:
- 3.1 函数作为变量传递
- 3.2. 函数作为返回值
5. 实际开发中闭包的应使用
pre class=”brush:js;toolbar:false”>// 判断一个数字能否出现过function isFirst() { var _list = []; return function(id) { if (_list.indexOf(id) >= 0) { return false; } else { _list.push(id); return true; } };}var first = isFirst();first(10);first(10);first(20);
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » JS基础面试题——作使用域及闭包