2017-02-21 10 views
0

У меня есть вопрос, есть проблема с функцией в программе, которую я делал в javascript.Почему моя функция «donthingy» считается «не объявленной»?

Функция должна работать, когда вы нажимаете на абзац, но когда я нажимаю, консоль javascript выдает следующее: «Неподготовлено ReferenceError: donethingy не определено Строка: 1".

JS:

window.onload = function(){ 
    var thy = document.getElementById("thy"); 
    var commanderIssue = document.getElementById("commanderIssue"); 
    var listado = document.getElementById("thaCosa"); 
    var thyLy = document.getElementsByTagName("p"); 
    var nli; 
    var thyText; 
    var inserting = "a"; 
    var commander = "b"; 
    thy.onclick = function(){ 
    inserting = "* " + prompt("Create a new item"); 
    nli = document.createElement("p"); 
    thyText = document.createTextNode(inserting); 
    nli.appendChild(thyText); 
    listado.appendChild(nli); 
    thyLy = document.getElementsByTagName("p"); 
    } 
    thyLy.onclick = function donethingy(){ 
    // thyLy.textDecoration.overline; 
    alert("done"); 
    } 
    commanderIssue.onclick = function(){ 
    alert("this thing is"); 
    } 
} 
+0

Потому что его не объявили ^^ – fubbe

+0

вы не можете создать именованный функцию и назначить его OnClick. поэтому он должен быть как этот формат 'sth.onclick = function() {};' – Smit

ответ

3

С синтаксисом вы использовали, имя donethingy фактически не стало именем функции, потому что вы присваиваете код в Funciton непосредственно к onclick имущества thyLy.

Вы можете сделать это:

// This is a function declaration that associates a name with the function 
function donethingy(){ 
    // thyLy.textDecoration.overline; 
    alert("done"); 
} 

// Then the function can be referred to or invoked by name 
thyLy.onclick = donethingy; 

Но, при создании и назначить функцию в одном операторе, функция фактически становится анонимным, поскольку он хранится и доступна через свойство, назначенное ему.

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

  • Анонимные функции не могут быть легко использованы повторно.
  • Анонимные функции не могут быть легко протестированы.
  • Именованные функции могут потребовать больше памяти, но могут быть использованы повторно и могут быть легко протестированы.
+0

Хотя это плохая практика, не будет 'thyLy.onclick = новая функция donethingy() {do stuff};' также работать? – Michael

+0

@Michael Это более чем плохая практика, это синтаксическая ошибка.Вы не используете 'new' и' function' вместе. –

+0

Вы вводите в заблуждение «конструктор функций» ('new Function() {}' - отмечаете капитал «F») с объявлением функции. Конструктор функций не используется для этой цели и не имеет большого смысла. –

2

Вы не установите переменные или onclick свойства функций, определенных как:

obj.onclick = function <name>() {} 

Вы можете установить на анонимные функции, как вы делали для commanderIssue.onclick.

Просто удалите имя функции, чтобы сделать его анонимным:

thyLy.onclick = function() { 
    alert("done"); 
} 
1

Это хорошо, чтобы помнить, что есть два способа определения функций:

  1. Объявления, которые выполняются когда вы их вызываете:

    function donethingy() { ... }

  2. Выражения, которые выполняются, когда переменная операторы выполняются:

    thyLy.onclick = function() { ... }

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