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.方法内定义的局部变量外 ...
随机推荐
- C#局域网桌面共享软件制作(二)
链接C#局域网桌面共享软件制作(一) 如果你运行这个软件查看流量监控就会发现1~2M/s左右的上传下载,并且有时会报错“参数无效”,如果你将屏幕截图保存到本地的话每张图片大概4M(bmp).120KB ...
- Winform主窗体的设置
软件必然涉及到一个主窗体MainForm,下面介绍一下几个简单的属性设置,可能比较有用 (1)icon,当然是咱们软件的图标了,设置上去即可 (2)isMdiContainer,这个比较重要了哦,必须 ...
- Vue.js学习 Item6 -- Class 与 样式绑定
数据绑定一个常见需求是操作元素的 class 列表和它的内联样式.因为它们都是 attribute,我们可以用 v-bind 处理它们:只需要计算出表达式最终的字符串.不过,字符串拼接麻烦又易错.因此 ...
- linux 常用命令及技巧
linux 常用命令及技巧 linux 常用命令及技巧:linux 常用命令总结: 一. 通用命令: 1. date :print or set the system date and time 2. ...
- Incorrect integer value: '' for column 'id' at row 1
最近在写个查询 插入语句的时候 我是这么写的 insert into test values('',$row[contentid],'".$tn."'); 结果搞死没插入进去 然 ...
- 02-线性结构3 Pop Sequence
Given a stack which can keep M numbers at most. Push N numbers in the order of 1, 2, 3, ..., N and p ...
- [terry笔记]ora-00904 invalid identifier—同义词
今天遇到一个问题,说起来也简单,但是困扰我半天. 升级数据库后,一个功能无法运行,在后台观察到其sql,发现sql中包含一个包执行不了,报错ora-00904 invalid identifier w ...
- [Prism框架实用分享]如何在主程序中合理的弹出子窗体
大家好 说起子窗体,大家都会想到ChildWindow,多熟悉的一个控件.不错,Sliverlight中已经提供了子窗体的具体实现,而在WPF中却没有这么好的事情(有的第三方控件商已经提供此控件).最 ...
- Hello World程序
本文最初发表于2015-8-??,是由别的地方迁移过来的 本文利用改写内存的办法在屏幕中央显示“Hello world”字符串. 首先我们需要了解80*25彩色字符模式显示缓冲区的结构. 〉〉内存中B ...
- 同时执行2个存储过程,2个SP中分别有相同的临时表名,会有冲突吗?
同时执行2个存储过程,2个SP中分别有相同的临时表名,会有冲突吗?答案:不会 这就可以在以后写存储过程的时候统一临时表名了. alter procedure sp_01 as begin create ...