这段代码的运行结果是什么?
var name = 'fulu';
(function() {
if(typeof name === 'undefined') {
var name = 'blog';
console.log('welcome to' + name)
} else {
console.log('hi' + name)
}
})();
这段代码的运行结果是:welcome to blog
。
在匿名函数内部有一个自己的变量name
,并且代码的顺序是先使用,后定义复制。这里就会出现一个变量提升的问题,所以此时我们函数内部的变量是先置顶声明,未赋值,也就是相当于,在匿名函数的内部第一行增加一句代码,var name;
这个时候用typeof
判断类型,得到的值为 'undefined'
。
以下代码输出结果是什么?
function printing() {
console.log(1);
setTimeout(function() {
console.log(2);
}, 1000);
setTimeout(function() {
console.log(3);
}, 0);
console.log(4);
}
printing();
输出结果为:1 4 3 2
想知道为什么输出顺序是这样的,我们需要弄了解 setTimeout()
做了什么,以及浏览器的事件循环原理。
浏览器有一个事件循环用于检查事件队列,处理延迟的事件。UI事件(例如点击,滚动等),Ajax回调,以及提供给 setTimeout()
和 setInterval()
的回调都会依次被事件循环处理。
因此,当调用 setTimeout()
函数时,即使延迟的时间被设置为0,提供的回调也会被排队。回调会乖乖地待在队列中,直到指定的时间用完后,它才开始执行动作。
以下代码输出结果是什么?
var a = {},
b = {key:'b'},
c = {key:'c'};
a[b] = 123;
a[c] = 456;
console.log(a[b]);
不少人可能会以为答案是 123
,但结果是 456
,为什么会是这样子的呢。
原因是我们忽略了一个知识点:JavaScript在设置对象的属性的时候,会暗中字符串化参数值。
在这里例子中,由于 b
和 c
都是对象,把它们设置为对象 a
的参数,它们都将被转换为 "[object Object]"
。
结果就是, a[b]
和 a[c]
都相当于 "[object Object]"
,而后者会将前者的值覆盖。
因此,设置或引用 a[c]
和设置或引用 a[b]
完全相同。所以得到的答案是 456
。
评论区