Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.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 为什么最后一个字符会重复打印?_Javascript_Jquery_Html - Fatal编程技术网

Javascript 为什么最后一个字符会重复打印?

Javascript 为什么最后一个字符会重复打印?,javascript,jquery,html,Javascript,Jquery,Html,我写了以下内容来设置div中文本的动画,但是我找不到最后一个字符是如何重复打印的 var textClass=$(“.first text”); var text=textClass.text(); textClass.text(“”); for(文本中的变量i){ $(textClass)。设置动画({ 不透明度:0.25 },200,函数(){ $(textClass.append(text.charAt(i)); }); } p:not(:第一个孩子){ 显示:无; } p{ 保证金:0

我写了以下内容来设置div中文本的动画,但是我找不到最后一个字符是如何重复打印的

var textClass=$(“.first text”);
var text=textClass.text();
textClass.text(“”);
for(文本中的变量i){
$(textClass)。设置动画({
不透明度:0.25
},200,函数(){
$(textClass.append(text.charAt(i));
});
}
p:not(:第一个孩子){
显示:无;
}
p{
保证金:0自动;
字体大小:24px;
}

HTML



在闭包方面,您已经学到了一些东西。当
i
循环并最终在函数内部运行时,它只查看最后一个字符,因为在第一个
animate()
实际触发之前,
i
被覆盖到最后一个字符

您可以通过自己手动创建一个闭包,将其包装在函数中并传入,以在循环时保留变量来抵消这一点

有关闭包的更多信息,请查看:

var textClass=$(“.first text”);
var text=textClass.text();
textClass.text(“”);
for(文本中的变量i){
(函数(字符){
$(textClass)。设置动画({
不透明度:0.25
},200,函数(){
$(textClass).append(text.charAt(char));
});
})(一)
}
p:not(:第一个孩子){
显示:无;
}
p{
保证金:0自动;
字体大小:24px;
}

HTML



您可以创建一个闭包,或者使用
let
const
for
循环中声明变量
i
,该变量将在每次迭代中保留
i
的当前值:

var textClass=$(“.first text”);
var text=textClass.text();
textClass.text(“”);
for(文本中的常量i){
$(textClass)。设置动画({
不透明度:0.25
},200,函数(){
$(textClass.append(text.charAt(i));
});
}
p:not(:第一个孩子){
显示:无;
}
p{
保证金:0自动;
字体大小:24px;
}

HTML



使用
let
const
而不是
var
可以获得更好的范围,无需创建闭包。也无需继续执行$(textClass)-您可以缓存对象

const$textClass=$(“.first text”);
常量text=$textClass.text();
$textClass.text(“”);
for(让我输入文本){
$textClass.animate({
不透明度:0.25
},200,函数(){
$textClass.append(text.charAt(i));
});
}
p:not(:第一个孩子){
显示:无;
}
p{
保证金:0自动;
字体大小:24px;
}

HTML



脚本中似乎有一个变量声明

var textClass = $(".first-text");
var text = textClass.text();
textClass.text("");
for (const i in text){
  $(textClass).animate({
    opacity: 0.25
  }, 200, function(){
    $(textClass).append(text.charAt(i));
  });
}
请查看以下JSFIDLE链接。

您需要进行一次关闭将文本中的
变量i
切换到文本中的
常量i
解决了这个问题。然后它成为一个作用域变量,而不是全局变量,因为它使用
var
感谢@unfected的上述修复,它起作用了(Y)我会在可能的情况下使用const来表示变量没有在代码中的任何其他地方更改感谢@mplungjan的修复,它起作用了,我想知道如果我使用
var I
let I
const I
有什么区别。即使OP不必要地将他的
textClass
包装在
$()
中,它也不会造成任何开销。jQuery将它视为一个jQuery对象,并简单地返回它。在我看来,它仍然是不雅观的-在某些情况下它不会,然后你添加了大量的开销谢谢你的答案,真的帮助我理解了错误背后的逻辑。但是为什么不为其他两个常量设置常量呢?他们没有改变他们没有问题@Code\u Ninja。Javascript使用闭包会变得非常糟糕,而
let/const
语法确实有助于澄清变量的范围。我几乎在任何地方都使用它们,而且根本没有使用
var
。@mplungjan他当然可以,我建议他这样做,但这不是他遇到的问题的范围,所以我尽量避免不必要地更改代码。