为什么我的功能" donethingy"考虑"未宣布"?

时间:2017-02-21 19:21:39

标签: javascript function

我有一个问题,我在javascript中执行的程序中存在函数问题。

当你单击一个段落时,该函数应该可以工作,但是当我点击时,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");
  }
}

3 个答案:

答案 0 :(得分:3)

使用您使用的语法,名称donethingy实际上不会成为函数的名称,因为您将函数的代码直接分配给onclick的{​​{1}}属性。

你可以这样做:

thyLy

但是,当您在一个语句中创建并分配函数时,该函数实际上会变为匿名,因为它是通过您为其分配的属性进行存储和访问的。

创建函数声明或匿名函数的决定需要考虑以下因素:

  • 无法轻易重复使用匿名函数。
  • 匿名函数无法轻松进行单元测试。
  • 命名函数可能需要更多内存,但可以重复使用 容易进行单元测试。

答案 1 :(得分:2)

您不要将变量或onclick属性设置为定义为:

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

您设置为匿名函数,就像您为commanderIssue.onclick所做的那样。

只需删除该函数的名称即可使其匿名:

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

答案 2 :(得分:1)

记住有两种定义函数的方法很好:

  1. 声明,在您调用它们时执行:

    function donethingy() { ... }

  2. 表达式,在执行变量语句时执行:

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