一道关于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 相关文章推荐
js 方法实现返回多个数据的代码
Apr 30 Javascript
基于jQuery的弹出消息插件 DivAlert之旅(一)
Apr 01 Javascript
JavaScript版DateAdd和DateDiff函数代码
Mar 01 Javascript
利用百度地图JSAPI生成h7n9禽流感分布图实现代码
Apr 15 Javascript
JS简单实现文件上传实例代码(无需插件)
Nov 15 Javascript
jquery实现在页面加载的时自动为日期插件添加当前日期
Aug 20 Javascript
web前端设计师们常用的jQuery特效插件汇总
Dec 07 Javascript
基于js里调用函数时,函数名带括号和不带括号的区别
Jul 28 Javascript
JavaScript基于activexobject连接远程数据库SQL Server 2014的方法
Jul 12 Javascript
详解使用React制作一个模态框
Mar 14 Javascript
elementUI select组件使用及注意事项详解
May 29 Javascript
vue实现点击按钮“查看详情”弹窗展示详情列表操作
Sep 09 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
php下实现一个阿拉伯数字转中文数字的函数
2008/07/10 PHP
php小技巧之过滤ascii控制字符
2014/05/14 PHP
php通过session防url攻击方法
2014/12/10 PHP
Laravel 5框架学习之路由、控制器和视图简介
2015/04/07 PHP
PHP+Ajax实现无刷新分页实例详解(附demo源码下载)
2016/04/07 PHP
PHP未登录自动跳转到登录页面
2016/12/21 PHP
php读取出一个文件夹及其子文件夹下所有文件的方法示例
2017/06/15 PHP
php微信开发之谷歌测距
2018/06/14 PHP
PHP如何解决微信文章图片防盗链
2020/12/09 PHP
论坛里点击别人帖子下面的回复,回复标题变成“回复 24# 的帖子”
2009/06/14 Javascript
JS函数验证总结(方便js客户端输入验证)
2010/10/29 Javascript
解读JavaScript中 For, While与递归的用法
2013/05/07 Javascript
通过javascript把图片转化为字符画
2013/10/24 Javascript
jQuery使用hide方法隐藏指定元素class样式用法实例
2015/03/30 Javascript
实例详解jQuery表单验证插件validate
2016/01/18 Javascript
解析JavaScript中的字符串类型与字符编码支持
2016/06/24 Javascript
vue.js入门(3)——详解组件通信
2016/12/02 Javascript
AngularJS自定义指令之复制指令实现方法
2017/05/18 Javascript
Webpack优化配置缩小文件搜索范围
2017/12/25 Javascript
Python实现曲线点抽稀算法的示例
2017/10/12 Python
Python使用Scrapy保存控制台信息到文本解析
2017/12/27 Python
Django+uni-app实现数据通信中的请求跨域的示例代码
2019/10/12 Python
python爬虫实例之获取动漫截图
2020/05/31 Python
python datetime时间格式的相互转换问题
2020/06/11 Python
Python爬虫教程知识点总结
2020/10/19 Python
HTML5 transform三维立方体实现360无死角三维旋转效果
2014/08/22 HTML / CSS
英国最大的婴儿监视器网上商店:Baby Monitors Direct
2018/04/24 全球购物
解决python 输出到csv 出现多空行的情况
2021/03/24 Python
公司成立感言
2014/01/11 职场文书
新农村建设典型材料
2014/05/31 职场文书
2015年度党员自我评价范文
2015/03/03 职场文书
人事任命通知书
2015/04/21 职场文书
2016元旦文艺汇演主持词
2015/07/06 职场文书
送给火锅店的创意营销方案!
2019/07/08 职场文书
在前女友婚礼上,用Python破解了现场的WIFI还把名称改成了
2021/05/28 Python
Golang表示枚举类型的详细讲解
2021/09/04 Golang