请问这道函数题是什么意思

class="lang-js">

var msg='hello';
for (var i=0; i<10; i++)
{
    var msg='hello'+i*2+i;
}
alert(msg);
阅读 3.1k
4 个回答

这题考的是var申明变量的作用域问题,简单来说javascript的var申明的变量是函数作用域,不是块级作用域(块级作用域是let).
所以循环里面的msg和外部的msg实际上是一个作用域下的变量
所以这题的答案就是msg = 'hello' + 9 * 2 + 9
此时根据运算符优先级先做 * 运算,然后做 + 运算
最后答案是'hello' + 18 + 9 => 'hello18' + 9 => 'hello189'

这道题考察了:
(1)JavaScript是一门弱类型语言的特性,所以你可以对同一变量赋不同类型的值
(2)控制流语句:循环语句for
(3)类型隐式转换:字符串和数字进行 + 操作时,会将数字转换为字符串。
(4)运算优先级:* 优先级高于 +,+高于=
(5)运算结合性:+,*结合性为自左向右,=结合性为自右向左
(6)变量作用域:不论es6,只从es5以及更早的es3来看,只有全局作用域,函数作用域两种。

本题中,两处var关键字声明的变量都是同一作用域下的变量,经过循环过后,取最后一次赋值的值为变量的最终值,"hello" + 9*2 + 9。
根据JavaScript中的+,*的优先级,结合性,变量隐式转换:
(1)var msg = "hello" + 18 + 9
(2)var msg = "hello18" + 9
(3)var msg = "hello189"

for循环外面的msg和for循环里面的msg都是全局变量,每次for都会重新定义全局变量msg,所以只要看最后一次for,i = 9; msg = 'hello'+i*2+i;alert(msg)// 'hello189'

这种类型的问题,先在浏览器中运行一下试试。

知识点主要是: 循环,数据类型转换,字符串连接符

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题