JavaScript函数 - 不能通过函数调用不接收变量?

时间:2014-03-25 16:15:24

标签: javascript

当我尝试运行以下功能时:

function saveUsername(wordOne, wordTwo, wordThree){

wordOne = wordOne.capitaliseFirstLetter();
wordTwo = wordOne.capitaliseFirstLetter();
wordThree = wordOne.capitaliseFirstLetter();

我收到以下错误:

Uncaught TypeError: Cannot call method 'capitaliseFirstLetter' of undefined 

似乎变量wordOne未定义,这没有意义,因为我已经明确地为它分配了一个字符串,甚至在此函数之前将其输出到页面的上游控制台(saveUsername)叫做。控制台显示变量存储得很好。

var wordOne = document.getElementById('droppedOne').innerHTML;
  console.log("Word one chosen = " + wordOne);

这是 saveUsername 函数无法获取正确变量值的问题吗?

以下是saveUsername的调用方式......

<div class="userNameButton" onclick="saveUsername(wordOne, wordTwo, wordThree)">

以下是最初存储值的方式:

function saveWord1(){
  var wordOne = document.getElementById('droppedOne').innerHTML;
}

编辑:根据评论中的解决方案,我已将window添加到全球化,但现在又出现了不同的错误:

function saveWord1(){
  window.wordOne = "test";
  var wordOne = document.getElementById('droppedOne').innerHTML;
  console.log("Word one chosen = " + wordOne);

<div class="userNameButton" onclick="saveUsername(wordOne, wordTwo, wordThree)">

未捕获的TypeError:对象测试没有方法'capitaliseFirstLetter'

这是大写功能。此函数位于saveWord1函数上方。

function capitaliseFirstLetter(string)
{
    return string.charAt(0).toUpperCase() + string.slice(1);
}

1 个答案:

答案 0 :(得分:1)

两个问题。

  1. HTML属性中分配的事件处理程序只能访问全局变量,因此wordOne必须可全局访问。

  2. capitalizeFirstLetter()不是字符串对象的本机方法,但可以这样做。实际上,它是一个接收参数的全局函数,并返回结果,因此您需要将wordOne作为参数传递,并用结果覆盖wordOne


  3. 旁注,如果您要使用全局变量,最好将它们全部收集在一个命名空间中。

    因此,在应用程序的顶部,创建一个全局对象(命名空间)

    window.MyStuff = {};
    

    然后,每当您需要添加或访问自己的全局变量时,请将其添加到(或从访问它)该命名空间。

    function saveWord1(){
      MyStuff.wordOne = "test";
      var wordOne = document.getElementById('droppedOne').innerHTML;
      console.log("Word one chosen = " + wordOne);
    

    <div class="userNameButton" onclick="saveUsername(MyStuff.wordOne, MyStuff.wordTwo, MyStuff.wordThree)">
    

    function saveUsername(wordOne, wordTwo, wordThree) {
    
        MyStuff.wordOne = capitaliseFirstLetter(wordOne);
        MyStuff.wordTwo = capitaliseFirstLetter(wordTwo);
        MyStuff.wordThree = capitaliseFirstLetter(wordThree);
    

    另请注意,在saveUsername()函数中,如果它总是在相同的3个全局变量上运行,那么你真的不需要传递它们。

    function saveUsername() {
    
        MyStuff.wordOne = capitaliseFirstLetter(MyStuff.wordOne);
        MyStuff.wordTwo = capitaliseFirstLetter(MyStuff.wordTwo);
        MyStuff.wordThree = capitaliseFirstLetter(MyStuff.wordThree);