一道关于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 相关文章推荐
input按钮的事件处理大全
Dec 10 Javascript
实现只能输入数字的input不用replace方法
Sep 12 Javascript
js post提交调用方法
Feb 12 Javascript
中文输入法不触发onkeyup事件的解决办法
Jul 09 Javascript
通过JS动态创建一个html DOM元素并显示
Oct 15 Javascript
Jquery解析Json格式数据过程代码
Oct 17 Javascript
jQuery EasyUI 布局之动态添加tabs标签页
Nov 18 Javascript
jQuery插件实现表格隔行变色及鼠标滑过高亮显示效果代码
Feb 25 Javascript
vue2.0实现导航菜单切换效果
May 08 Javascript
js实现1,2,3,5数字按照概率生成
Sep 12 Javascript
JS基于for语句编写的九九乘法表示例
Jan 04 Javascript
element-ui 弹窗组件封装的步骤
Jan 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
PHP与已存在的Java应用程序集成
2006/10/09 PHP
制作安全性高的PHP网站的几个实用要点
2014/12/30 PHP
php连接oracle数据库的核心步骤
2016/05/26 PHP
PHP设计模式概论【概念、分类、原则等】
2020/05/01 PHP
可输入的下拉框
2006/06/19 Javascript
Javascript 同时提交多个Web表单的方法
2009/02/19 Javascript
Jquery节点遍历next与nextAll方法使用示例
2014/07/22 Javascript
javascript 获取函数形参个数
2014/07/31 Javascript
js实现iframe跨页面调用函数的方法
2014/12/13 Javascript
JavaScript实现ASC转汉字及汉字转ASC的方法
2016/01/23 Javascript
Bootstrap实现渐变顶部固定自适应导航栏
2020/08/27 Javascript
基于Vue2.0+ElementUI实现表格翻页功能
2017/10/23 Javascript
Vue $emit $refs子父组件间方法的调用实例
2018/09/12 Javascript
vue单页面应用打开新窗口显示跳转页面的实例
2018/09/21 Javascript
vue配置文件实现代理v2版本的方法
2019/06/21 Javascript
微信小程序-API接口安全详解
2019/07/16 Javascript
17道题让你彻底理解JS中的类型转换
2019/08/08 Javascript
ES6的循环与可迭代对象示例详解
2021/01/31 Javascript
[43:35]EG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python深入学习之上下文管理器
2014/08/31 Python
python中as用法实例分析
2015/04/30 Python
Python的消息队列包SnakeMQ使用初探
2016/06/29 Python
Python中将变量按行写入txt文本中的方法
2018/04/03 Python
python实现多层感知器MLP(基于双月数据集)
2019/01/18 Python
python基于FTP实现文件传输相关功能代码实例
2019/09/28 Python
python实现吃苹果小游戏
2020/03/21 Python
Python函数默认参数常见问题及解决方案
2020/03/26 Python
详解Pycharm第三方库的安装及使用方法
2020/12/29 Python
CSS3中的display:grid,网格布局介绍
2019/10/30 HTML / CSS
咖啡书吧创业计划书
2014/01/13 职场文书
商场活动策划方案
2014/01/24 职场文书
心理咨询承诺书
2014/05/20 职场文书
医学求职信
2014/05/28 职场文书
关于保护环境的建议书
2014/08/26 职场文书
产品委托授权书范本
2014/09/16 职场文书
2015年精神文明建设工作总结
2015/04/21 职场文书