Javascript on click事件不读取else语句或变量
我试图创建一个调用函数的点击处理程序;这个函数得到一个字符串,基本上是将最后一个字符切分,并将其添加到前面,每次再次单击时,它应该将最后一个字母添加到前面 一开始看起来很简单,我以为我可以用数组方法来完成Javascript on click事件不读取else语句或变量,javascript,arrays,string,scope,closures,Javascript,Arrays,String,Scope,Closures,我试图创建一个调用函数的点击处理程序;这个函数得到一个字符串,基本上是将最后一个字符切分,并将其添加到前面,每次再次单击时,它应该将最后一个字母添加到前面 一开始看起来很简单,我以为我可以用数组方法来完成 function scrollString() { var defaultString = "Learning to Code Javascript Rocks!"; var clickCount = 0; if (clickCount === 0) {
function scrollString() {
var defaultString = "Learning to Code Javascript Rocks!";
var clickCount = 0;
if (clickCount === 0) {
var stringArray = defaultString.split("");
var lastChar = stringArray.pop();
stringArray.unshift(lastChar);
var newString = stringArray.join('');
clickCount++;
} else {
var newArray = newString.split("");
var newLastChar = newArray.pop();
newArray.unshift(newLastChar);
var newerString = newArray.join("");
clickCount++;
}
document.getElementById('Result').innerHTML = (clickCount === 1) ? newString : newerString;
}
$('#button').on('click', scrollString);
现在它只在我第一次点击时起作用,开发者工具说newArray是未定义的;此外,clickCount停止递增。我不知道这是一个范围问题,还是应该采取完全不同的方法来解决这个问题?事实上,这是一个范围问题。计数器位于函数内部,因此每次调用函数时,它都会被设置为0。如果您想要一个超出范围的计数器,并且实际上保持了一个正确的计数,则需要从函数中提取它
如果您想保持简单,即使只是将clickCount移到函数上方,也应该可以工作。每次单击时,您实际上是在重置字符串。检查范围
var str=“学习编写Javascript代码!”;
var button=document.getElementById(“按钮”);
var output=document.getElementById(“输出”);
output.innerHTML=str;
按钮。addEventListener(“单击”,函数(e){
str=str.charAt(str.length-1)+str.substring(0,str.length-1);
output.innerHTML=str;
});代码>
按钮{
显示:块;
利润率:25px0;
}
点击我!
我不知道这是否是一个范围问题
是的,这是一个范围问题,实际上不止一个
怎么做?
正如@ThePublimeObject所指出的,计数器位于函数内部,因此每次发生单击事件时都会重新初始化计数器
即使您将计数器置于函数之外,您仍将面临另一个范围问题。在函数的else
部分,您正在操作在if
代码段内初始化的变量(newString
)。因为,如果
代码段这次没有运行,它将抛出错误undefined
。(又是一个范围问题)
一个好办法是:
将计数器和defaultString
置于函数外部。如果defaultString
动态获取值,而不是您在代码中显示的值,则在页面加载或任何其他事件(如change
等)中提取其值,而不是将其传递到函数中
不要将操作结果指定给新字符串。而是将其指定给defaultString
。这样,您可能不需要使用if-else
循环和newLastChar
来处理更新的结果
相应地操纵对元素的赋值
您可以使用Javascript闭包功能
var scrollString = (function() {
var defaultString = "Learning to Code Javascript Rocks!";
return function() {
// convert the string into array, so that you can use the splice method
defaultString = defaultString.split('');
// get last element
var lastElm = defaultString.splice(defaultString.length - 1, defaultString.length)[0];
// insert last element at start
defaultString.splice(0, 0, lastElm);
// again join the string to make it string
defaultString = defaultString.join('');
document.getElementById('Result').innerHTML = defaultString;
return defaultString;
}
})();
使用它,您不需要全局声明任何变量或任何计数器元素
要了解Javascript闭包,请参考以下内容:
这个答案比我的好得多。投票表决。我太懒了,没有真正做这部分。非常好。谢谢,我很感激!非常简单,伙计,谢谢……我想我想我考虑过了这个过程,因为我还在学习编码:)天才……我确实想使用闭包,但我不知道如何实现一个解决方案;我感谢你的帮助。。。除息的