(function () { var a = b = 5; })()
console.log(b)
String.prototype.repeatify = String.prototype.repeatify || function (times) { let str = ""; for (let i = 0; i < times; i++) { str += this; } return str; }
let s1 = "hellow";
console.log(s1.repeatify(4));
这个问题测试了开发人员对 javascript 中继承及原型(prototype
)属性的知识。这也验证了开发人员是否有能力扩展原生数据类型功能(虽然不应该这么做)。
在这里,另一个关键点是,看你怎样避免重写可能已经定义了的方法。这可以通过在定义自己的方法之前,检测方法是否已经存在。
3.闭包
for (var i = 0; i < 5; i++) {
setTimeout(function () { console.log(i) }, 1000) }
输出是5个5,闭包是,有权访问另一个函数变量的函数,因为i
在代码添加处理程序的作用域中,该变量属于处理程序的闭包。闭包中的变量的值不是静态的,因此i
的值不是添加处理程序时的值。在处理程序将被执行的时候,会自动变化
通过采用立即执行函数输出0,1,2,3,4
for (var i = 0; i < 5; i++) { (function (i) { setTimeout(function () { console.log(i) }, 1000) })(i) }
4.事件循环:下面输出什么
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
,提供的回调也会被排队。回调会呆在队列中,直到指定的时间用完后,引擎开始执行动作(如果它在当前不执行其他的动作)。因此,即使setTimeout()
回调被延迟0
毫秒,它仍然会被排队,并且直到函数中其他非延迟的语句被执行完了之后,才会执行。
有了这些认识,理解输出结果为“1”就容易了,因为它是函数的第一句并且没有使用setTimeout()
函数来延迟。接着输出“4”,因为它是没有被延迟的数字,也没有进行排队。然后,剩下了“2”,“3”,两者都被排队,但是前者需要等待一秒,后者等待0秒(这意味着引擎完成前两个输出之后马上进行)。这就解释了为什么“3”在“2”之前。