2013-06-13 4 views
-5

У меня есть этот вопрос в интервьюJavascript: распечатать индекс массива

Используя javascript, напишите массив из n элементов. Каждый элемент массива - это функция, вызывающая console.log собственного индекса. Для, например, первый элемент будет console.log 0, второй элемент будет console.log 1 ....

Заранее спасибо

Редактировать: Извините за вопрос, прежде чем исследовать. Im новое для программирования & не знаю, что закрывает & не смог найти что-то в поиске. Я получил ответ сам, но вот проблема, которую я имел. Я написал что-то вроде этого

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]() 
} 
+1

В чем проблема? Что вы пробовали? Вы знаете закрытия? – Bergi

+5

_ У меня этот вопрос в интервью_ - нет. Это даже проще, чем fizzbuzz. – Halcyon

+2

точный дубликат [Закрытие Javascript внутри петель - простой практический пример] (http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example) – Bergi

ответ

2

Существует не простой способ сделать то, что вы просите, потому что, если поместить функцию в каждом элементе массива, эта функция не будет знать, что это индекс массива не было, если вам каким-то образом связала пользовательскую функцию для каждого индекса массива.

Но все это звучит немного похоже на то, что вы не говорите нам, что представляет собой настоящая проблема. Если вы выполняете итерацию по массиву и вызываете функцию в элементе массива, просто передайте индекс этой функции в качестве первого аргумента.

Вы могли бы назвать каждую функцию в массиве и передать его индекс слота, как это:

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); 
} 

Или, скажите нам, что реальная проблема, поэтому мы можем более непосредственно помочь решить это.

+4

Люди расстраиваются, когда вы на самом деле отвечаете на вопрос вопрос, который считается слишком тривиальным или каким-то вопросом домашней работы/интервью. Я, с другой стороны, не верю, что требует ниспроверки. Это действительный ответ, независимо от морали, стоящей за вопросом. Кто-то, где-то, может искренне хотеть узнать ответ по более чистым причинам. – mpen

+0

@Mark - thx Mark. Похоже, что downvote был удален. Оригинальный вопрос оставляет желать лучшего. Мой личный питомец - это когда люди задают вопрос о каком-то решении, не сообщая нам, что представляет собой реальная проблема (это прекрасный случай), поэтому мы не можем помочь с реальной проблемой. Но я стараюсь сделать все возможное, чтобы быть полезным, учитывая предоставленную информацию. – jfriend00

+0

(Это был не мой нисходящий). Тем не менее, я иногда склоняюсь к ответам (любым) на вопросы с [очевидными дубликатами] (http://stackoverflow.com/questions/750486/javascript-closure-inside-loops- простой-практический пример), где лучшие ответы уже существуют. – Bergi

0

Для этого нужно один (из нескольких способов).

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 относится к самой функции, внутри самой себя. Таким образом, функция ищет себя внутри массива, к которому он привязан, и распечатывает найденный индекс.

EDIT

Как jfriend00 отметил correnctly, 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 
+0

FYI, 'arguments.callee' не поддерживается в строгом режиме, и, вероятно, мы должны писать код либо сейчас, либо в будущем. – jfriend00

+0

Я знаю, что это не поддерживается. Я хотел опубликовать ответ без использования закрытий (думаю, потому что мне было приятно, если функция не имеет в нем «жестко закодированного» номера). Ну ... Полагаю, я поставил записку в конце. В любом случае, спасибо, что указали это. – basilikum

+0

@basilikum: Просто используйте именованную функцию: 'function findme() {console.log (this.indexOf (findme)); } ' – Bergi

Смежные вопросы