2014-03-25 142 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);