(1)
var a =10;
function test(){
a = 100;
console.log(a)
console.log(this.a)
var a;
console.log(a)
}
test()
//作用域 this 变量提升
答案:100 10 100
(2)
(function(){
var a=b=3
})()
console.log(a) //报错
console.log(b) //3
解析: var a=b=3 执行是的是 b=3; var a=b
在函数内部没有找到3相当于在全局变量声明了一个b=3,因此console.log(b)为3
而var a在函数内部声明了,作用域在函数内部,因此在外面console.log(a)所以报错.
(3)
for(var i = 1; i<=3;i++){
setTimeout(function(){
console.log(i)
},0)
}
答案 :444
// 事件循环 等待队列 异步
解析:js是单线程语言,for是同步,在主线程,setTimeout是异步,要放在等待队列.主线程所有任务执行完毕后,在把等待里面的任务放在主线程里面执行.因此主线程for循环执行完毕后,i已经等于4,因此输出三个4,var在全局作用域
如果把var改成了let,则输出123.因为es5只有两种作用域:全局作用域和函数作用域,es6新增了块级作用域.for循环循环了3次,相当于产生了3个块级作用域,因此每一个i的值都是不一样
(4)
function fun(n){
console.log(n) //123
var n = 456
console.log(n) //456
}
var n =123
fun(n)
答案:123 456
如果function fun() 则为und 和 456
作用域:先内部找,如果找不到,再向外部找
优先级:变量>普通函数>参数>提升
(5)
function fun(){
console.log(n) //123
n = 456 //前面没有var 没有变量提升
console.log(n) //456
}
var n =123
fun()
答案:123 456
解析:第一个n在函数里面找,没找到,因此去外面找,所以是123,接着n=456,也在函数内部找n,给n赋值,也没找到,因此全局n赋值为456,因此下面的那个n也输出为456
(6)
function fun(){
console.log(n) //und
n = 456
console.log(n) //456
}
fun()
var n =123
答案:und 456
(7)
function fun(){
console.log(fun) //fn
fun = 456
console.log(fun) //456
}
fun()
var fun =123
答案:fn 456
解析:因为预解析函数优先级比var要高,因此fun = funcition fun,所以第一个答应的是fn
如果var fun =123放在最上面,fun还是会俾fun =123 先执行,因此最后fun(),会报错,因为这时候fun = 123,不是一个函数,调用不了
(8)
var iNum = 0
for(var i = 0;i<10;i++){
if(i%5==0){
continue
}
iNum++
}
console.log(iNum)
答案:8
解析:i=1,iNum=1,
i=2,iNum=2,
...
i=5,iNum=4
i=6,iNum=5
...
i=9的时候跳出循环,所以INum=8
(9)
<script>
var a = 1
</script>
<script>
var a
var b = a / 0 //b==infinity
if(b==b){
console.log(b*2+'2'+4)
}else{
console.log(!b*2+'2'+4)
}
</script>
答案:Infinity24
解析:因为a=1,1/0为正无穷大,即Infinity,Infinity==Infinity为true,
Infinity*2还是无穷大为Infinity,因此为Infinity24
(10)
答案:输出btn,因为是btn按钮执行的,因此this指向btn
(11)
18行实际上是新创建了一块新内存,实际上两块内存