几道常见面试题

1.作用域(Scope)的问题:
  (function () {
            var a = b = 5;
   })()
console.log(b)
 正常情况下 输出是5,如果是严格模式,报错 b is not defined (如果现在严格模式下,需要吧b挂在在window对象上 var a = window.b = 5;)
 
2.在 String 对象上定义一个 repeatify 函数。这个函数接受一个整数参数,来明确字符串需要重复几次。这个函数要求字符串重复指定的次数
 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”之前。

猜你喜欢

转载自www.cnblogs.com/garyzhijiang/p/9155918.html