10道典型的JavaScript面试题

  

<强>问题1:作用域(范围)

  

考虑以下代码:

        (函数(){   var=b=5;   })();    console.log (b);      

控制台(控制台)会打印出什么?

  5

  

如果严格模式开启,那么代码就会报错”未捕获ReferenceError: b没有定义”。请记住,如果这是预期的行为,严格模式要求你显式地引用全局作用域,所以,你需要像下面这么写:

        (函数(){   使用严格的;   var=窗口。b=5;   })();    console.log (b);      

<强>问题2:创建“原生(本地)”方法

  

在字符串对象上定义一个repeatify函数。这个函数接受一个整数参数,来明确字符串需要重复几次。这个函数要求字符串重复指定的次数。举个例子:

  

<代码> console.log (“hello”.repeatify(3));

  

应该打印出hellohellohello。

  

        String.prototype。repeatify=String.prototype。repeatify | |函数(次){   var str=";   (var=0;我& lt;次;我+ +){   str +=;   }   返回str;   };      

在这里,另一个关键点是,看你怎样避免重写可能已经定义了的方法。这可以通过在定义自己的方法之前,检测方法是否已经存在。

  

<代码> String.prototype。repeatify=String.prototype。repeatify | |函数(次){/*代码*/};

  

<强>问题3:变量提升(提升)

  

执行以下代码的结果是什么?为什么?

        功能测试(){   console.log(一个);   console.log (foo ());   var=1;   函数foo () {   返回2;   }   }   测试();      

  

这段代码的执行结果是定义和2 .

  

这个结果的原因是,变量和函数都被提升(升起)到了函数体的顶部,因此,当打印变量时,它虽存在于函数体(因为一个已经被声明),但仍然是未定义的。换言之,上面的代码等同于下面的代码:

        功能测试(){   var;   函数foo () {   返回2;   }   console.log(一个);   console.log (foo ());=1;   }   测试();      

<强>问题4:在javascript中,“这”是如何工作的

  

以下代码的结果是什么?请解释你的答案。

        var fullname=癑ohn Doe”;   var obj={   fullname:“科林Ihrig”,   道具:{   fullname:“奥雷里奥·德·罗莎”,   getFullname:函数(){   返回this.fullname;   }   }   };   console.log (obj.prop.getFullname ());   var=obj.prop.getFullname测试;   console.log(测试());      

  

这段代码打印结果是:奥雷·德·罗莎和John Doe。原因是,JavaScript中关键字这所引用的是函数上下文,取决于函数是如何调用的,而不是怎么被定义的。

  

在第一个console.log (), getFullname()是作为obj.prop对象的函数被调用。因此,当前的上下文指代后者,并且函数返回这个对象的fullname属性。相反,当getFullname()被赋值给测试变量时,当前的上下文是全局对象的窗口,这是因为测试被隐式地作为全局对象的属性。基于这一点,函数返回窗口的fullname,在本例中即为第一行代码设置的。

  

<强>问题5:调用()和应用()

  

修复前一个问题,让最后一个console.log()打印输出奥雷·德·罗莎。

  

  

这个问题可以通过运用电话()或者应用()方法强制转换上下文环境。

  

<代码> console.log (test.call (obj.prop));

  

<强>问题6:闭包(关闭)

  

考虑下面的代码:

        var=document.getElementsByTagName节点(“按钮”);   (var=0;我& lt;nodes.length;我+ +){   节点[我]。addEventListener(“点击”,函数(){   控制台。日志(你点击元素# + i);   });   }      

请问,如果用户点击第一个和第四个按钮的时候,控制台分别打印的结果是什么?为什么?

  

  

两次打印都是nodes.length的值。

  

<强>问题7:闭包(关闭)

  

修复上题的问题,使得点击第一个按钮时输出0点击第二个按钮时输出1,依此类推。

  

  

有多种办法可以解决这个问题,下面主要使用两种方法解决这个问题。

  

第一个解决方案使用立即执行函数表达式(IIFE)再创建一个闭包,从而得到所期望的我的值。实现此方法的代码如下:

10道典型的JavaScript面试题