下面这段javascript代码,
1 2 3 4 5 6 |
|
最后一句alert的输出结果是? //hello189
javascript只有函数域,没有块作用域的概念,所以在同一个作用域中同一个变量声明多次还是第一次声明那个!(所以for循环不会形成作用域)
编译器在解析的时候,会发现声明了两个变量,但是后面的那个发现前面的已经声明了所以被忽略。所以for循环中的msg的声明其实是无效的,从头至尾都是在操作同一个msg。
而for循环里面的var msg=
‘hello‘
+i*2+i;只是相当于再次赋值操作而已。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2.
现有如下html结构
1 2 3 4 5 6 |
|
运行如下代码:
1 2 3 4 5 6 7 |
|
依次点击4个li标签,哪一个选项是正确的运行结果()? //依次弹出4,4,4,4
每个li标签的onclick事件执行时,本身onclick绑定的function的作用域中没有变量i,i为undefined,则解析引擎会寻找父级作用域,发现父级作用域中有i,且for循环绑定事件结束后,i已经赋值为4,所以每个li标签的onclick事件执行时,alert的都是父作用域中的i,也就是4。这是作用域的问题。
解答:这里的事件,绑定的并非是i的值,而是i本身(alert里的i),所以当程序执行完,i的值变为4,去执行onclick事件时,执行alert(i) ,自动查找i,值为4,所以依次弹出4。
改正:
1 2 3 4 5 6 7 8 9 10 |
|
避免在循环中创建函数,可以在循环之外创建一个辅助函数,让这个辅助函数返回一个绑定了当前i值得函数,避免混淆
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
3.
|
请问 a 的结果是什么? //undefined
javascript只有函数作用域, 没有块作用域,即if,for等语句里声明的变量和其外一层的变量的作用域是一样的(函数作用域,作用域的“局部"是相对于函数而言的)。
使用var声明的变量会被自动添加到最接近的环境的顶部(即全局作用环境中);变量提升仅提升变量声明,而不是变量赋值。
变量提前问题,等价于:
1 2 3 4 5 |
|
这题还有一个细节 ,在代码的顶部var声明的变量会被认为是window的属性,如果在代码中直接使用a=
"foo" ,变量同样会被认为是全局变量但是并不是window的属性。
1 2 3 4 5 6 7 |
|
这样的话会弹出1