2016-08-30 2 views
-4

При выполнении следующего кода, я получаю ошибкуJavascript «не может прочитать свойство не определено»

«не может прочитать свойство„слово“неопределенных на звёздный.

I «м действительно застряли, почему так что любая помощь будет оценена по достоинству!

function MyStim(word,instruction) { 
    this.word = word; 
    this.instruction = instruction; 
}; 

var data = [new MyStim("Cat","Forget"), new MyStim("Dog","Remember"), new MyStim("Sour Patch Kids","Never Forget"), new MyStim("Cookies", "Remember")] 

function getpresent() { 
    return { 
     type: "single-stim", 
     **stimulus: "<p style= font-size:100px;text-align:center;padding-top:300px;>"+data[i].word+"</p>",** 
     is_html: true, 
     timing_stim: 250, 
     timing_response: 2000, 
     response_ends_trial: false, 
    } 
}; 

for (var i = 0; i<80; i++){ 
    timeline.push(getpresent(i)); 
    i++; 
}; 
+0

Убедитесь, что вы тестируете каждую часть своей программы, особенно коды, которые запускаются сначала, а затем код цикла цикла. В этом случае просто выполнение getpresent (0) должно было его поймать. – Nishant

+0

Вы также получите индекс за пределы, когда ваша переменная «i» пройдет мимо длины массива. У вас есть 4 объекта в вашем массиве, и вы ссылаетесь на весь код до 79 в своем коде ... – jordaniac89

+0

вы зацикливаете 80 раз и имеете значительно меньше предметов – aw04

ответ

3

getpresent не имеет ссылки на i переменные, вы ожидающие I t иметь.

Изменить

function getpresent() { 

Для

function getpresent (i) { 
0

Проблема заключается в том, что вы не определили аргумент называется i вашей функции:

function getpresent (i) { 
    return { 
     type: "single-stim", 
     stimulus: "<p style= font-size:100px;text-align:center;padding-top:300px;>"+data[i].word+"</p>", 
     is_html: true, 
     timing_stim: 250, 
     timing_response: 2000, 
     response_ends_trial: false, 
    } 
}; 

Итак, когда вы назвали функцию у i будет значение. Следовательно, вы пытаетесь прочитать значение word по значению undefined.

Кроме того, у вас есть еще две ошибки в цикле for.

  • Вам не нужно i++ в теле вашего цикла
  • Вы должны петля в диапазоне [0, data.length)

Скорректированная петли следующим образом:

for (var i = 0; i<data.length; i++){ 
    timeline.push(getpresent(i)); 
} 
+0

Это была ошибка ввода с моей стороны, она все еще не работает с аргументом i. – user5826447

+0

@ user5826447 Вы правы. Я не проверял инструкцию 'for'. См. Мое обновление. – Christos

0

параметр «i» в вашей функции «getpresent» отсутствует.

+0

Это была ошибка ввода с моей стороны, она все еще не работает с аргументом i. – user5826447

0

После устранения проблемы function getpresent(i) я заметил три оставшихся проблемы с этим фрагментом кода.

Этот цикл -

for (var i = 0; i<80; i++){ 
    timeline.push(getpresent(i)); 
    i++; 
}; 

i++ линии внутри блока контура не является необходимым. Ваш IIFE ((var i = 0; i<80; i++)) делает это за вас.

Этот IIFE также выполняет цикл длиннее длины массива данных. Поэтому после того, как он попадает к последнему элементу массива данных, он ловит «слово», не определено, поскольку больше нет объектов для повторения. Изменение 80 до data.length разрешает это. (В качестве альтернативы вы можете проверить наличие данных [i] перед вызовом функции).

Внутри временной линии цикла. Нигде в этом кодовом блоке не инициализирована временная шкала и поэтому не будет доступна нигде вне этого цикла. Добавление var timeline = [] решает эту проблему (если у вас нет этого набора в другом месте).

function MyStim(word,instruction) { 
    this.word = word; 
    this.instruction = instruction; 
}; 

var data = [new MyStim("Cat","Forget"), new MyStim("Dog","Remember"), new MyStim("Sour Patch Kids","Never Forget"), new MyStim("Cookies", "Remember")] 

function getpresent (i) { 
    return { 
     type: "single-stim", 
     stimulus: "<p style= font-size:100px;text-align:center;padding-top:300px;>"+data[i].word+"</p>", 
     is_html: true, 
     timing_stim: 250, 
     timing_response: 2000, 
     response_ends_trial: false, 
    } 
}; 

//added initialization 
var timeline = []; 

//changed '80' to 'data.length' 
for (var i = 0; i < data.length; i++){ 
    timeline.push(getpresent(i)); 
    //removed "i++" 
}; 


console.log(timeline) 
0

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

<script> 
function PresentBuilder() 
{ 
    this.type = "single-stim"; 
    this.is_html = true; 
    this.timing_stim = 250; 
    this.timing_response = 2000; 
    this.response_ends_trial = false; 

    this.set_type = function (type){ 
     this.type = type; 
     return this; 
    }; 

    this.set_is_html = function (is_html){ 
     this.is_html = is_html; 
     return this; 
    }; 

    this.set_timing_stim = function (timing_stim){ 
     this.timing_stim = timing_stim; 
     return this; 
    }; 

    this.set_timing_response = function (timing_response){ 
     this.timing_response = timing_response; 
     return this; 
    }; 

    this.set_response_ends_trial = function (response_ends_trial){ 
     this.response_ends_trial = response_ends_trial; 
     return this; 
    }; 

    this.getpresent = function (data){ 
     return { 
      type: this.type, 
      stimulus: "<p style= font-size:100px;text-align:center;padding-top:300px;>"+data.word+"</p>", 
      is_html: this.is_html, 
      timing_stim: this.timing_stim, 
      timing_response: this.timing_response, 
      response_ends_trial: this.response_ends_trial, 
     } ; 
    }; 
}; 

function MyStim(word, instruction) { 
    this.word = word; 
    this.instruction = instruction; 
}; 

var data = [new MyStim("Cat","Forget"), new MyStim("Dog","Remember"), new MyStim("Sour Patch Kids","Never Forget"), new MyStim("Cookies", "Remember")]; 

timeline = []; 
for (var i = 0; i<data.length; i++){ 
    timeline.push(new PresentBuilder().set_response_ends_trial(true).getpresent(data[i])); 
}; 

for (var i = 0; i<timeline.length; i++){ 
    console.log(timeline[i]); 
} 
</script> 

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

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