2014-03-25 103 views
-1

当我尝试运行以下功能: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)"> 

未捕获的类型错误:对象测试没有方法 'capitaliseFirstLetter'

这里是利用功能。该功能位于saveWord1功能之上。

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

请张贴你如何调用函数。如果你没有传递任何参数给函数,那么这些参数将是'undefined'。 –

+0

啊,那一定是吧,我没有在onclick舞台上通过他们。 – Francesca

+0

'onclick'属性中唯一可以访问的变量是全局变量。 –

回答

1

两个问题。在HTML属性分配只能访问全局变量

  1. 事件处理程序,所以wordOne必须是全局访问。

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


侧面说明,如果你要使用全局变量,它是收集他们都在一个单一命名空间是一个好主意。

因此,在您的应用程序的顶部,创建一个全局对象(命名空间):每次你需要添加或访问自己的全局变量的一次

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