关于javascript作用域的常见面试题分享


Posted in Javascript onJune 18, 2017

本文主要给大家分享了关于javascript作用域面试题的相关内容,分享出来供大家参考学习,下面来一起看看吧。

一、作用域:

在了解作用域之前,首先需要明白一些基础概念:

每一个变量、函数都有其作用的范围,超出作用不得使用,这个叫做作用域。

二、全局变量、局部变量:

1.全局变量:

     (1)在全局范围内声明的变量,如var a=1;

     (2)只有赋值没有声明的值,如a=2; (注:如果a=2在函数环境中,也是全局变量)

2.局部变量:

      写入函数中的变量,叫做局部变量。

3.作用:

     (1)程序的安全。

     (2)内存的释放。

三、作用域链:

查找量的过程。先找自己局部环境有没有声明或者是函数,如果有,则查看声明有无赋值或者是函数的内容,如果没有,则向上一级查找。

四、预解析顺序:

每个程序都要做的工作,程序开始先预解析语法,标点符号是否有误,解析内存是否可容纳,解析变量……直到解析无误了,才开始按正常的流程顺序走。试想一下,如果没有预解析顺序,直接按流程顺序走,可能程序执行到最后一个函数,发现了语法错误,才开始报错,那性能要有多差啊!

顺序内容:

      1.文件内引用的<script>块依次解析,从上到下连成一片。

      2.每个script块内部的var(注意:只解析变量名,不解析值,如var a=2;将var a解析在环境的开头,并不解析后面的值,只有当程序执行到var a=2这行时,才会给变量赋值),function解析到本块的开头。

      3.依次解析每个环境,将var,function解析到环境的开头。

五、应用场景(一些常见的作用域相关的面试题):

var a="aa";
function test(){
 alert(a);//undefined,函数执行后,在函数环境内,var a会预解析,当弹出a时,首先先找本层环境内有无声明,发现有。但是代码没有执行到赋值,所以结果是undefined。
 var a="bb";//var a会预解析在函数开头,执行到这行才进行赋值
 alert(a);//“bb”
}
test();
alert(a);//"aa" 找全局环境下的声明,找到了var a="aa"
var a="aa";
function test(){
 alert(a);//“aa”,函数执行后,在函数环境内,没有找到本层环境关于a的声明,所以开始向上一层环境查找。
 a="bb";//执行到这行开始改变全局a的量
}
test();
alert(a);//"bb" 全局环境的a在函数执行时已经被改变
function test(){ 
 b();//函数b会被预解析,因此可以调用,执行了输出1;
 var a=1;
 function b(){
  console.log(1);
  console.log(a);//undefined
  var a=2;
 }
}
test();

六、总结:

要搞清楚一个变量的作用域,重点是搞清楚预解析顺序,然后再判断作用域的范围,这些都是有套路可言:先找本层环境有无声明,有的话,看是否进行了赋值;只有声明没有执行赋值,就是undefined。没有声明也没有赋值的话,就再向上一层查找,直到找到为止。如果所有的执行环境都没有找到,那么控制台就会报错变量找不到。

函数的话就更简单了:找本层环境是否有预解析的函数,有的话即可执行。没有的话还是向上查找。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
简单三步,搞掂内存泄漏
Mar 10 Javascript
EXT窗口Window及对话框MessageBox
Jan 27 Javascript
关于js遍历表格的实例
Jul 10 Javascript
JavaScript中document.forms[0]与getElementByName区别
Jan 21 Javascript
快速学习jQuery插件 Form表单插件使用方法
Dec 01 Javascript
自己动手制作基于jQuery的Web页面加载进度条插件
Jun 03 Javascript
jQuery实现对网页节点的增删改查功能示例
Sep 18 jQuery
node.js利用mongoose获取mongodb数据的格式化问题详解
Oct 06 Javascript
js 获取json数组里面数组的长度实例
Oct 31 Javascript
浅谈Fetch 数据交互方式
Dec 20 Javascript
使用vue开发移动端管理后台的注意事项
Mar 07 Javascript
JS实现指定区域的全屏显示功能示例
Apr 25 Javascript
Angular.js中下拉框实现渲染html的方法
Jun 18 #Javascript
Webpack打包css后z-index被重新计算的解决方法
Jun 18 #Javascript
利用JavaScript对中文(汉字)进行排序实例详解
Jun 18 #Javascript
JavaScript ES6中const、let与var的对比详解
Jun 18 #Javascript
jquery DataTable实现前后台动态分页
Jun 17 #jQuery
jQuery Jsonp跨域模拟搜索引擎
Jun 17 #jQuery
vue router路由嵌套不显示问题的解决方法
Jun 17 #Javascript
You might like
PHP结合JQueryJcrop实现图片裁切实例详解
2014/07/24 PHP
php基于mcrypt_encrypt和mcrypt_decrypt实现字符串加密解密的方法
2016/07/12 PHP
php获取ajax的headers方法与内容实例
2017/12/27 PHP
PHP7 字符串处理机制修改
2021/03/09 PHP
asp.net和asp下ACCESS的参数化查询
2008/06/11 Javascript
不一样的文字闪烁 轮番闪烁
2009/11/11 Javascript
Javascript基础知识(三)BOM,DOM总结
2014/09/29 Javascript
node.js中的fs.fstat方法使用说明
2014/12/15 Javascript
详解页面滚动值scrollTop在FireFox与Chrome浏览器间的兼容问题
2015/12/03 Javascript
微信小程序  wx.request合法域名配置详解
2016/11/23 Javascript
AngularJS使用ng-repeat和ng-if实现数据的删选显示效果示例【适用于表单数据的显示】
2016/12/13 Javascript
jQuery extend()详解及简单实例
2017/05/06 jQuery
AngularJS实现图片上传和预览功能的方法分析
2017/11/08 Javascript
vue 过滤器filter实例详解
2018/03/14 Javascript
点击按钮弹出模态框的一系列操作代码实例
2019/03/29 Javascript
浅谈layui使用模板引擎动态渲染元素要注意的问题
2019/09/14 Javascript
vue限制输入框只能输入8位整数和2位小数的代码
2019/11/06 Javascript
JS数组进阶示例【数组的几种函数用法】
2020/01/16 Javascript
[40:50]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第四场
2014/05/24 DOTA
Python中使用socket发送HTTP请求数据接收不完整问题解决方法
2015/02/04 Python
Python的网络编程库Gevent的安装及使用技巧
2016/06/24 Python
Python使用email模块对邮件进行编码和解码的实例教程
2016/07/01 Python
python实现自动登录后台管理系统
2018/10/18 Python
python中对_init_的理解及实例解析
2019/10/11 Python
Python切片列表字符串如何实现切换
2020/08/06 Python
HTML5在a标签内放置块级元素示例代码
2013/08/23 HTML / CSS
Mamas & Papas沙特阿拉伯:英国最受欢迎的婴儿品牌
2017/11/20 全球购物
Footshop法国:购买运动鞋
2020/01/19 全球购物
Bath & Body Works阿联酋:在线购买沐浴和身体用品
2021/02/27 全球购物
农救科工作职责
2013/11/27 职场文书
外语专业毕业生自荐信
2014/04/14 职场文书
社区维稳工作方案
2014/06/06 职场文书
党性心得体会
2014/09/03 职场文书
工商局所长四风自我剖析及整改措施
2014/10/26 职场文书
Python djanjo之csrf防跨站攻击实验过程
2021/05/14 Python
Go语言实现一个简单的并发聊天室的项目实战
2022/03/18 Golang