Javascript:函数参数的灵活性?

Javascript:函数参数的灵活性?,javascript,function,parameters,scope,chaining,Javascript,Function,Parameters,Scope,Chaining,W3上Javascript函数参数的描述不是很清楚,所以我只想澄清一下 根据我的理解,没有类型限制;参数的“实际值”被传递到方法中。是否有方法传递对象或元素?或者这就是所谓的“真正价值”吗 例如: 函数displayText用于获取输入文本,并设置一个显示,以显示给定输入文本中的新词,每次调用该新词时都转到下一个词 function displayText() { var text = document.getElementById("words").value; // Since t

W3上Javascript函数参数的描述不是很清楚,所以我只想澄清一下

根据我的理解,没有类型限制;参数的“实际值”被传递到方法中。是否有方法传递对象或元素?或者这就是所谓的“真正价值”吗

例如:

函数
displayText
用于获取输入文本,并设置一个显示,以显示给定输入文本中的新词,每次调用该新词时都转到下一个词

function displayText() {
    var text = document.getElementById("words").value; 
// Since text is initialized   
// every time the method is called, 
// it will always start at the beginning of the text area. 
// Not sure how to fix this since making `text` 
// a global variable doesn't work 
    var list = text.split(/[ \t\n]+/);
    displayNext(list, "display");
}
有一个“helper”方法,
displayNext
,它应该转移到列表中的下一个单词,并将显示设置为该单词

function displayNext(list, textboxID) {
    document.getElementById(textboxID).innerHTML = list.shift();
}
这并没有按预期工作。我很确定这是因为我把参数搞砸了,因为
displayNext
将innerHTML设置为null<代码>列表必须未正确通过。我不知道如何解决这个问题

我相信有一种更有效的方法可以做到这一点,但这是一个了解Javascript参数实际工作原理的好机会,所以我想我应该问问


根据代码中的注释,您似乎希望
displayText()
每次都显示“下一个”单词。要做到这一点,您必须创建一些位置来存储下一个要显示的单词的状态。现在,每次都创建一个新数组,并始终显示第一个单词

最简单的方法是在函数外的某个持久范围内创建一个变量,在该范围内存储字号:

var wordNum = 0;
function displayText() {
    var text = document.getElementById("words").value; 
    var list = text.split(/\s+/);
    if (list.length !== 0) {
        // make sure we aren't off the end of the list
        wordNum = wordNum % list.length;
        displayNext(list[wordNum++], "display");
    }
}

function displayNext(text, textboxID) {
    document.getElementById(textboxID).innerHTML = text;
}

有关Javascript函数参数的更多信息,甚至如何检测传递了哪些参数或重载了哪些参数,请参见以下回答:有关参数传递方式的更多信息:

您每次都创建一个新数组,因此可以将相同的值从新数组中移出()。另外,可变值(通常是对象)基本上是通过引用传递的,而不可变原语基本上是通过值传递的。旁注:您不能在
displayText
函数中使用
var text
,因为
text
是一个参数,它已经定义好了。哦,对不起,这是我忘记删除的。对不起,谢谢您的详细解释!不过,我似乎还是遇到了同样的问题。不幸的是。我收到一条错误消息:UncaughtTypeError:无法将属性“innerHTML”设置为null。你知道这是为什么吗?我使用的是window.onload,所以在加载之前不加载HTML不会有问题scripts@user3450277-如果该消息来自此代码,则表示
document.getElementById(textboxID)
未找到匹配的DOM元素,因此返回
null
。如果您创建一个JSFIDLE来显示您的问题,我们可能会帮助您在几分钟内修复它。否则,你的HTML和运行Javascript的时间都会有问题,这两个问题你都没有向我们透露。好吧!我做了一个。希望这能起作用,谢谢你的帮助!我会把它添加到帖子中well@user3450277-这是一个工作版本:。我对函数的设计做了一点修改,使其对我更有意义,并将其速度减慢了一点,以便我能更好地看到它。希望你能看到它是如何工作的,并适应你想要的。只需在我的JSFIDLE中按start键即可看到它运行。我让它无限循环直到你停下来。