【问题标题】:Javascript: print out index of an array [closed]Javascript:打印出数组的索引[关闭]
【发布时间】:2013-06-10 12:41:19
【问题描述】:

面试中有这个问题

使用 javascript,编写一个包含 n 个元素的数组。数组中的每个元素都是一个调用自己索引的 console.log 的函数。例如,第一个元素将 console.log 0,第二个元素将 console.log 1....

提前致谢

编辑:很抱歉在研究之前询问。我是编程新手,不知道什么是闭包,在搜索中找不到东西。我自己得到了答案,但这是我遇到的问题。我写了这样的东西

n = 10
var array = []
for (var i=0; i < n; i ++) {
array[i] = function() {
        console.log(i);
    }
}

for (var j=0; j < n; j ++) {
    array[j]()
}

【问题讨论】:

标签: javascript arrays indexing


【解决方案1】:

没有一种简单的方法可以满足您的要求,因为如果您在每个数组元素中放置一个函数,该函数将不知道它的数组索引是什么,除非您以某种方式为每个数组索引绑定了一个自定义函数.

但是,所有这些听起来有点像您没有告诉我们真正的问题是什么。如果您要遍历数组并调用数组元素中的函数,则只需将索引作为第一个参数传递给该函数。

您可以调用数组中的每个函数并将其插槽的索引传递给它,如下所示:

function fn1(index) {
    console.log(index);
    // do other things here specific to this function
}
// fn2 ... fn4 definitions

var listOfFunctions = [fn1, fn2, fn3, fn4];

for (var i = 0; i < listOfFunctions.length; i++) {
    listOfFunctions[i](i);
}

或者,告诉我们真正的问题是什么,以便我们更直接地帮助解决。

【讨论】:

  • 当您实际回答一个被认为过于琐碎的问题或某种家庭作业/面试问题时,人们会感到不安。另一方面,我不认为这值得反对。无论问题背后的士气如何,这是一个有效的答案。某个地方的某个人可能出于更纯粹的原因真正想知道答案。
  • @Mark - 谢谢马克。看起来反对票已被删除。最初的问题确实有很多不足之处。我个人的烦恼是当人们问一些关于解决方案的问题而没有告诉我们真正的问题是什么(这是一个完美的例子),所以我们无法帮助解决真正的问题。但是,鉴于所提供的信息,我会尽力提供帮助。
  • @Bergi - 由于 OP 没有包含他们自己的代码,因此只能猜测这个问题是否与此问题有关。这可能是或者这可能是一个不同的问题。我根本没有像您那样阅读它,这就是为什么我提供了不同的答案。
  • 是的,只传递索引绝对是最简单的方法 :-) 原来缺少闭包确实是他的问题。但是,您当前的代码不起作用:您是忘记了其他 4 个函数声明还是您的意思是 [fn1, fn1, fn1, …, fn1]
【解决方案2】:

这是一种(多种方法)。

var arr = [];

for (var i = 0; i < 10; i++) {
    arr.push(function(){
        console.log(this.indexOf(arguments.callee));
    });
}

arr[3](); //3
arr[7](); //7

this 将引用数组,如果你以arr[index]() 的方式调用你的函数。 arguments.callee 指的是函数本身,在其内部。因此该函数在它所附加的数组中搜索自身并打印出找到的索引。

编辑

正如 jfriend00 正确指出的那样,arguments.callee 已被弃用,并且在严格模式下不受支持。 所以这是一个“更清洁”的解决方案(来自 Bergi 的建议):

var arr = [], func;

for (var i = 0; i < 10; i++) {
    arr.push(function printIndex(){
        console.log(this.indexOf(printIndex));
    });
}

arr[3](); //3
arr[7](); //7

【讨论】:

  • 仅供参考,arguments.callee 在严格模式下不受支持,这可能是我们现在或将来编写代码的方式。
  • 我知道它不受支持。我想在不使用闭包的情况下发布答案(我想是因为如果函数中没有“硬编码”数字,我发现它会更好)。嗯...我想我在最后放了一张便条。无论如何,感谢您指出这一点。
  • @basilikum:只需使用命名函数:function findme(){ console.log(this.indexOf(findme)); }
  • @Bergi 我只想写这行不通,因为您只创建一个函数并在所有数组项中引用相同的函数。所以indexOf 总是指索引0。但我想如果你围绕它创建一个闭包,那么它会起作用。是的,好主意。
  • 不,实际上您不需要闭包 - 函数表达式每次都会计算为不同的函数。或者至少应该JScript has a serious bug with named function expressions
猜你喜欢
  • 2022-01-16
  • 1970-01-01
  • 2018-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-05
相关资源
最近更新 更多