一道关于JavaScript变量作用域的面试题


Posted in Javascript onMarch 08, 2016

小编觉得这道题对理解JavaScript 作用域还是很有帮助的,特此又把自己的解题思路梳理了一遍,希望对其它人有所帮助。

首先看下面试题:

var arr = [1, 2, 3];
  for (var i = 0, j; j = arr[i++];) {
    console.log(j);
  }

  console.log('---------');
  console.log(i);
  console.log('---------');
  console.log(j);
  console.log('---------');

在解题前,我们先回顾下 JavaScript 中,变量域相关的知识。

全局变量(Global)
全局变量是指在任何地方都可以访问的变量,有两种情况

在 function 外面声明,不论是否用 var 关键字
在 function 里面声明,不使用 var 关键字,当然声明的语句必须被执行才可以
局部变量(Local )
局部变量只能在被声明的 function 内部才能访问
在 function 里面声明,使用 var 关键字
两点要注意的地方

先看代码:

alert(i); // 输出 undefined
 
 for (var i = 0; i < 1; i++){};
 
 alert(i); // 输出1

JavaScript 不存在语句作用域,在语句内定义的变量会扩散到语句外边, 例子中 i 在 for 语句中声明,但是在 for 语句的外面任然可以访问
在 for 语句之前就可以访问到 i ,只不过这时候还没有被赋值
开始我们的解题

i++ 是在 i 使用后再自加:

第一次执行时,j=arr[0],之后 i=1,console.log(j) 输出 1

第二次执行时,j=arr[1],之后 i=2,ocnsole.log(j) 输出 2

第三次执行时,j=arr[2],之后 i=3,ocnsole.log(j) 输出 3

第四次(不符合 for  条件),j=arr[3] 为 undefined,之后 i=4,ocnsole.log(j) 没有输出,退出 for 循环

for 语句执行结束后,console.log(i) 由上分析可知输出 4,console.log(j) 输出 undefined

最后输出结果为:

2
---------
---------
undefined
---------

针对上面的分析和结果,想必大家都已经搞清楚了吧,然后我们开始举一反三吧。

借题改题一
题目:
var arr = [1, 2, 3];

for (var i = 0, j; j = arr[++i];) {
    console.log(j);
  }

  console.log('---------');
  console.log(i);
  console.log('---------');
  console.log(j);
  console.log('---------');

答案:

2
3
---------
3
---------
undefined
---------

借题改题二
题目:

function xxx() {
    var arr = [1, 2, 3];
    for (var i = 0, j; j = arr[i++];) {
      console.log(j);
    }
  }
  xxx();

  console.log('---------');
  console.log(i);
  console.log('---------');
  console.log(j);
  console.log('---------');

答案:

1
2
3
---------
报错:Uncaught ReferenceError: i is not defined

为大家就分享到这,希望对大家理解JavaScript作用域有所帮助。

Javascript 相关文章推荐
常用jQuery选择器总结
Jul 11 Javascript
jquery实现的鼠标下拉滚动置顶效果
Jul 24 Javascript
jQuery可见性过滤选择器用法示例
Sep 09 Javascript
快速使用node.js进行web开发详解
Apr 26 Javascript
微信小程序 swiper组件构建轮播图的实例
Sep 20 Javascript
JavaScript 判断对象中是否有某属性的常用方法
Jun 14 Javascript
JS判断字符串是否为整数的方法--简单的正则判断
Jul 23 Javascript
Windows下Node爬虫神器Puppeteer安装记
Jan 09 Javascript
Vue程序调试的方法
Jun 17 Javascript
kafka调试中遇到Connection to node -1 could not be established. Broker may not be available.
Sep 17 Javascript
echarts实现折线图的拖拽效果
Dec 19 Javascript
解决Vue 给mapState中定义的属性赋值报错的问题
Jun 22 Javascript
理解javascript函数式编程中的闭包(closure)
Mar 08 #Javascript
jQuery实现带水平滑杆的焦点图动画插件
Mar 08 #Javascript
javascript对象的创建和访问
Mar 08 #Javascript
js获取当前日期时间及其它日期操作汇总
Mar 08 #Javascript
使用JQuery实现智能表单验证功能
Mar 08 #Javascript
js表单处理中单选、多选、选择框值的获取及表单的序列化
Mar 08 #Javascript
JS实现设置ff与ie元素绝对位置的方法
Mar 08 #Javascript
You might like
全国FM电台频率大全 - 14 江西省
2020/03/11 无线电
PHP中限制IP段访问、禁止IP提交表单的代码
2011/04/23 PHP
$_GET['goods_id']+0 的使用详解
2013/06/06 PHP
用Laravel轻松处理千万级数据的方法实现
2020/12/25 PHP
JavaScript confirm选择判断
2008/10/18 Javascript
JS 动态加载脚本的4种方法
2009/05/05 Javascript
Array栈方法和队列方法的特点说明
2014/01/24 Javascript
跟我学习javascript的call(),apply(),bind()与回调
2015/11/16 Javascript
jQuery内容过滤选择器用法示例
2016/09/09 Javascript
js手机号4位显示空格,银行卡每4位显示空格效果
2017/03/23 Javascript
详解angularjs 关于ui-router分层使用
2017/06/12 Javascript
用js将long型数据转换成date型或datetime型的实例
2017/07/03 Javascript
Vue 中使用 CSS Modules优雅方法
2018/04/09 Javascript
使用JS实现导航切换时高亮显示的示例讲解
2018/08/22 Javascript
Vue插件从封装到发布的完整步骤记录
2019/02/28 Javascript
微信小程序商品详情页底部弹出框
2019/11/22 Javascript
[01:35]辉夜杯战队访谈宣传片—iG.V
2015/12/25 DOTA
python创建和使用字典实例详解
2013/11/01 Python
Python基于DES算法加密解密实例
2015/06/03 Python
Python安装pycurl失败的解决方法
2018/10/15 Python
pycharm创建一个python包方法图解
2019/04/10 Python
Python实现使用request模块下载图片demo示例
2019/05/24 Python
Django框架实现的分页demo示例
2019/05/25 Python
scikit-learn线性回归,多元回归,多项式回归的实现
2019/08/29 Python
python+selenium 点击单选框-radio的实现方法
2019/09/03 Python
python代数式括号有效性检验示例代码
2020/10/04 Python
DKNY品牌官网:纽约大都会时尚风格
2016/10/20 全球购物
建筑工程管理专业自荐信范文
2013/12/28 职场文书
学校联谊活动方案
2014/02/15 职场文书
党政领导班子民主生活会整改措施
2014/09/18 职场文书
2014年十八届四中全会思想汇报范文
2014/10/17 职场文书
交通事故案件代理词
2015/05/23 职场文书
少年犯观后感
2015/06/11 职场文书
15个值得收藏的JavaScript函数
2021/09/15 Javascript
python_tkinter事件类型详情
2022/03/20 Python
鲲鹏 CentOS 7 安装Python3.7
2022/05/11 Servers