Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript on click事件不读取else语句或变量_Javascript_Arrays_String_Scope_Closures - Fatal编程技术网

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闭包,请参考以下内容:

    这个答案比我的好得多。投票表决。我太懒了,没有真正做这部分。非常好。谢谢,我很感激!非常简单,伙计,谢谢……我想我想我考虑过了这个过程,因为我还在学习编码:)天才……我确实想使用闭包,但我不知道如何实现一个解决方案;我感谢你的帮助。。。除息的