当我尝试运行以下功能时:
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);
}
答案 0 :(得分:1)
两个问题。
HTML属性中分配的事件处理程序只能访问全局变量,因此wordOne
必须可全局访问。
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);