马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
媒介
在下首语言是golang,以是会用他作为示例。
原文拜见 @arialdomartini的: Back-End Developer Interview Questions
代码示例标题
1. 这段Javascript函数的输出是什么?
- function hookupevents() {
- for (var i = 0; i < 3; i++) {
- document.getElementById("button" + i)
- .addEventListener("click", function() {
- alert(i);
- });
- }
- }
复制代码 这段JavaScript代码界说了一个名为hookupevents的函数,该函数的重要作用是为三个ID分别为"button0"、"button1"和"button2"的HTML元素添加点击变乱监听器。当这些按钮被点击时,会触发一个匿名函数,该函数会弹出一个告诫框体现变量i的值。
然而,由于闭包的特性,当变乱处置处罚函数被实际实验时,它会访问其所在的词法作用域中当时生存的i变量的值,而不是变乱绑定时的值。在循环竣过后,i的值将是3,因此无论点击哪一个按钮,弹出的告诫框都将体现数字3。
以是,如果实验hookupevents()函数并依次点击这三个按钮,弹出的告诫框都会体现数字3。这就是著名的JavaScript闭包陷阱的一个例子。要办理这个标题,可以使用IIFE(立即调用的函数表达式)或其他方式来捕捉每个循环迭代时i的值,如下所示:
- function hookupevents() {
- for (var i = 0; i < 3; i++) {
- (function(index) {
- document.getElementById("button" + index)
- .addEventListener("click", function() {
- alert(index);
- });
- })(i);
- }
- }
复制代码 通过这种方式,每个按钮的变乱处置处罚函数会记着各自绑定时的index值,从而精确体现0、1或2。
2. 关于范例擦除(Type Erasure),这段Java代码的输出是什么?为什么?
- ArrayList<Integer> li = new ArrayList<Integer>();
- ArrayList<Float> lf = new ArrayList<Float>();
- if (li.getClass() == lf.getClass()) // evaluates to true
- System.out.println("Equal");
复制代码 在Java中,由于范例擦除(Type Erasure)的机制,上述代码段的输出将会是:
缘故因由在于Java泛型在编译后的字节码中并不生存详细范例参数信息。在运行时, ArrayList<Integer>和ArrayList<Float>都会酿成原始的非泛型类ArrayList。因此,li.getClass()和lf.getClass()实际上都是获取到ArrayList类的Class对象,以是在运行时比力这两个类对象时,效果是相称的。
&n
|