JavaScript 关于变量作用域的一道面试题
ShineJaie 原创,转载请注明出处。
昨晚在一个交流群里看到有位网友提了一个他的面试题求助答疑。刚好我也有看到,就对这个问题思考了一下,觉得这道题对理解 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 里面声明,使用 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
最后输出结果为:
1
2
3
---------
4
---------
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的变量作用域
1.JavaScript的作用域链 2.函数体内部,局部变量的优先级比同名的全局变量高. 3.JavaScript没有块级作用域. 4.函数中声明的变量在整个函数中都有定义. 5.未使用var关键字定 ...
- 深入理解JavaScript的变量作用域(转载Rain Man之作)
在学习JavaScript的变量作用域之前,我们应当明确几点: JavaScript的变量作用域是基于其特有的作用域链的. JavaScript没有块级作用域. 函数中声明的变量在整个函数中都有定义. ...
- 深入理解JavaScript的变量作用域
在学习JavaScript的变量作用域之前,我们应当明确几点: JavaScript的变量作用域是基于其特有的作用域链的. JavaScript没有块级作用域. 函数中声明的变量在整个函数中都有定义. ...
- JavaScript函数变量作用域
变量作用域 在JavaScript中,用var申明的变量实际上是有作用域的. 如果一个变量在函数体内部申明,则该变量的作用域为整个函数体,在函数体外不可引用该变量. 如果两个不同的函数各自申明了同一变 ...
- Javascript之变量作用域
分析: 无论是强类型语言c#.c++.java等语言,还是弱类型语言如Javascript,所有变量可以抽象为两种类型,即局部变量和全局变量. 全局变量:整个作用域可见. 局部变量:局部可见,退出作用 ...
- javascript的变量作用域--对比js、php和c的for循环
为什么要写这篇文章呢?主要是给自己提个醒,js的水很深,需要小心点儿才能趟过去,更何况自己不是专业人士,那就得更加小心了. 看下面的js代码: <!DOCTYPE html> <ht ...
- 浅谈javascript中变量作用域和内存(2)
1.无块级作用域 javascript没有块级作用域,这会让其他程序员在理解js代码上很痛苦.在其他很多语言,比如C,大括号括起来的代码块都有自己的作用域 举个例子 if(true) { var na ...
- JavaScript的变量作用域
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 浅谈javascript的变量作用域
1.变量遵循先声明再使用. console.log(b); b=123; 代码运行结果: Uncaught ReferenceError: b is not defined 2.方法内定义的局部变量外 ...
随机推荐
- oracle的表名、字段名、constraint名的长度限制分别是多少?
文章出处:http://blog.csdn.net/haiross/article/details/38379615 Oracle:表名.字段名.constraint名的长度有限制 oracle 的命 ...
- JS正则表达式使用方法及示例
1.定义正则表达式: a.普通方式:var reg=/表达式/附加参数 附件参数: g:代表可以进行全局匹配.i:代表不区分大小写匹配.m:代表可以进行多行匹配. 上面三个参数,可以任意组合,代表复合 ...
- c# 实现串口编程-操作LED屏幕
串口编程主要用到SerialPort这个类,主要实现对串口发送字节数组然后点阵屏显示相关信息,其实这个功能很简单下面给大家把整体思路用流程图展现如下:. 其实整体思路就如流程图.下面是整个流程图的一个 ...
- Sliverlight中PagedCollectionView的使用
最近项目中一直在和PagedCollectionView这个类打交道.通过它,我们可以以分页的形式自动处理并显示集合中的片段,尤其是和Pager控件配合的时候更能彰显其威力. PagedColecti ...
- grunt初体验
最近参与多人团队项目开发过程之中,使用到了grunt来构建项目,包括一些文件的压缩,合并等操作.亲自动手进行grunt任务的配置,学到了很多东西.现将自己的学习过程记录如下: 1.对于一个项目而言,使 ...
- js 将json字符串转换为json兑现
在数据传输过程中,json是以文本,即字符串的形式传递的,而JS操作的是JSON对象,所以,JSON对象和JSON字符串之间的相互转换是关键.例如:JSON字符串:var str1 = '{ &quo ...
- 如何排查java.lang.NoSuchMethodError错误
今天碰到一个java.lang.NoSuchMethodException的异常.基本解决思路是: 1.检查类所在jar包的版本是否正确. 2.检查是否有jar包冲突,比如加载了多个版本的xxx.ja ...
- build a git repo and clone
First machine: git init --bare gitrepo.git Second machine: git clone user@server:~/gitrepo.git cd gi ...
- [笔记]--Oracle 10g在Windows 32位系统使用2G以上内存
1.修改c:\boot.ini文件 打开boot.ini文件,我的电脑->属性->高级->启动和恢复->编辑,设置在最后一行末尾添加/PAE选项后如下: [boot loade ...
- wpf程序热键的一个类
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServi ...