关于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 相关文章推荐
一页面多XMLHttpRequest对象
Jan 22 Javascript
javascript函数中的arguments参数
Aug 01 Javascript
IE6 hack for js 集锦
Sep 23 Javascript
js实现从中间开始往上下展开网页窗口的方法
Mar 02 Javascript
在JS中操作时间之getUTCMilliseconds()方法的使用
Jun 10 Javascript
AngularJS Module方法详解
Dec 08 Javascript
jQuery操作属性和样式详解
Apr 13 Javascript
基于Bootstrap实现的下拉菜单手机端不能选择菜单项的原因附解决办法
Jul 22 Javascript
js 自带的sort() 方法全面了解
Aug 16 Javascript
vue单页应用中如何使用jquery的方法示例
Jul 27 jQuery
Angularjs 1.3 中的$parse实例代码
Sep 14 Javascript
vue 解决在微信内置浏览器中调用支付宝支付的情况
Nov 09 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
追求程序速度,而不是编程的速度
2008/04/23 PHP
批量修改RAR文件注释的php代码
2010/11/20 PHP
Windows中使用计划任务自动执行PHP程序实例
2014/05/09 PHP
微信公众平台网页授权获取用户基本信息中授权回调域名设置的变动
2014/10/21 PHP
PHP实现的json类实例
2015/07/28 PHP
PHP读取文本文件并逐行输出该行使用最多的字符与对应次数的方法
2016/11/25 PHP
Prototype使用指南之form.js
2007/01/10 Javascript
网易JS面试题与Javascript词法作用域说明
2010/11/09 Javascript
jquery下checked取值问题的解决方法
2012/08/09 Javascript
javascript打印html内容功能的方法示例
2013/11/28 Javascript
上传图片js判断图片尺寸和格式兼容IE
2014/09/01 Javascript
分享一则javascript 调试技巧
2015/01/02 Javascript
js点击文本框弹出可选择的checkbox复选框
2016/02/03 Javascript
Javascript中的迭代、归并方法详解
2016/06/14 Javascript
AngularJS框架中的双向数据绑定机制详解【减少需要重复的开发代码量】
2017/01/19 Javascript
jQuery插件FusionWidgets实现的AngularGauge图效果示例【附demo源码】
2017/03/23 jQuery
JavaScript使用原型和原型链实现对象继承的方法详解
2017/04/05 Javascript
Javascript实现基本运算器
2017/07/15 Javascript
vue和webpack打包项目相对路径修改的方法
2018/06/15 Javascript
JavaScript使用面向对象实现的拖拽功能详解
2019/06/12 Javascript
javascript设计模式之迭代器模式
2020/01/30 Javascript
jQuery 选择方法及$(this)用法实例分析
2020/05/19 jQuery
vue+iview使用树形控件的具体使用
2020/11/02 Javascript
[01:20]PWL开团时刻DAY9——听说潮汐没用?
2020/11/10 DOTA
python 捕获 shell/bash 脚本的输出结果实例
2017/01/04 Python
python遍历一个目录,输出所有的文件名的实例
2018/04/23 Python
基于pygame实现童年掌机打砖块游戏
2020/02/25 Python
Softmax函数原理及Python实现过程解析
2020/05/22 Python
Python如何读写字节数据
2020/08/05 Python
python实现不同数据库间数据同步功能
2021/02/25 Python
致跳远、跳高运动员广播稿
2014/01/09 职场文书
市优秀教师事迹材料
2014/02/05 职场文书
乔迁之喜主持词
2014/03/27 职场文书
承诺书范文
2014/06/03 职场文书
乡镇平安建设汇报材料
2014/08/25 职场文书
股权转让协议范本
2014/12/07 职场文书