【发布时间】:2018-10-07 18:28:07
【问题描述】:
所以我正在学习javascript(?),我遇到了这种情况,我真的找不到直接的答案。
所以我在要更改背景颜色的 html 页面中有这些段落,我正在使用的代码是这样的:
var colors=['red','pink','blue'];
var div2paragraphs = document.querySelectorAll('#div2 p')
for (let paragraph = 0; paragraph < div2paragraphs.length; paragraph++) {
(function(paragraph) {
div2paragraphs[paragraph].onmouseover = function(){
this.setAttribute('style', `background-color: ${colors[paragraph]}`)}
div2paragraphs[paragraph].onmouseout = function(){
this.setAttribute('style', 'background-color: white')}
})(paragraph);
}
我也不太明白这里发生了什么,我只是想用整个“function(){}”来做这件事(据说叫做匿名函数?),但显然有一个叫做 an javascript 中的 IIFE,因此您必须 WRAP 函数并传递一个唯一变量以使其每次在循环中运行,尽管我仍然不明白为什么我必须以“(段落)”结束。
我在想是否可以通过为每个 setAttribute 操作创建一个函数来做同样的事情,所以我尝试这样写:
var colors=['red','pink','blue'];
var div2paragraphs = document.querySelectorAll('#div2 p')
function changeToColor(color) {
this.setAttribute('style', 'background-color: ' + color);
}
function changeBackWhite() {
this.setAttribute('style', 'background-color: white');
}
for (let paragraph = 0; paragraph < div2paragraphs.length; paragraph++) {
div2paragraphs[paragraph].onmouseover = changeToColor('red');
div2paragraphs[paragraph].onmouseout = changeBackWhite;
}
但无论我做什么,它总是会出现错误:
Uncaught TypeError: this.setAttribute is not a function
或类似的东西。我认为这与这些情况有关,如果添加括号,它会在执行其他任何操作之前调用该函数?所以它不知道“这个”是什么?我不太明白,但无论如何,我对如何用单独的函数编写我上面所做的相同的事情一无所知。有人能对此有所了解吗...?
我更习惯 Python,所以显然有一些不同的基本概念......
PS:下面这两个例子有什么区别?
for (let paragraph = 0; paragraph < div2paragraphs.length; paragraph++) {
div2paragraphs[paragraph].onmouseover = function() {
this.style['background-color'] = colors[paragraph];
}
div2paragraphs[paragraph].onmouseout = function() {
this.style['background-color'] = 'white';
}
}
还有这个
for (let paragraph = 0; paragraph < div2paragraphs.length; paragraph++) {
div2paragraphs[paragraph].onmouseover = function(){
this.setAttribute('style', `background-color: $(colors[paragraph]`)
}
div2paragraphs[paragraph].onmouseout = function(){
this.setAttribute('style', 'background-color: white')
}
}
为什么第一个(由 ibrahim mahrir 提供)有效而第二个无效?
【问题讨论】:
-
顺便说一句,您不需要循环内的内部 IIFE,因为您已经在使用
let。它尊重块范围。 -
更多关于 IIFE:stackoverflow.com/questions/8228281/…
-
所以它不知道
this是什么? Yessssss :) this - JavaScript | MDN -
因为您的template literal 不正确。它应该是
`background-color: ${colors[paragraph]}`而不是`background-color: $(colors[paragraph]`。我的解决方案根本不使用模板文字,这就是我之前没有注意到它的原因。 -
哦,谢天谢地,这只是一个错字,不是我发疯。非常感谢先生!
标签: javascript arrays function for-loop