js循环绑定事件在编写JS代码的时候,我们经常会遇到要对一系列元素进行事件绑定的情况,然后就会理所当然的开一个for循环,对元素的事件进行赋值等操作,最后运行的效果却不是希望有的样子,事件的响应...

在进行数据绑定时,会遇到这种这种参数没有被传进去的情况,注释的哪一个console.log(i)输出的都是trs.length,主要是因为只有鼠标经过的时候才会调用。绑定事件的时候 i并没有传入执行函数里,这里的onmouseover函数的变量i 指向的是内存地址,所以打印该函数里面的i的结果都是 trs.length

因为trs[3]超出了伪数组,所以是undefined

那该如何解决这种问题呐?

1.将str[i]换成this,this指向当前对象

2.闭包思想

所谓闭包思想,就是:由于javascript中,,函数内部可以读取全局变量,但是函数外部是不可以读取到函数内部的局部变量的。闭包简单的理解就是能够读取其他函数内部变量的函数,本质上闭包就是将函数内部和函数外部链接起来的桥梁。

通过自执行匿名函数将i的值传进去,此时我将里面的for循环的i变量已经变成了j,如若不然,会改变i的值,最后的trs[i].style.backgroundColor = 'pink'; 会报错。


首先知道什么是自执行匿名函数

对函数表达式加上(),是可以直接调用的

但是如果是对声明式的后部加上()则是会被编译器忽略。

varfn2 =function(){}();    //对,就是这样

functionfn1(){}();    //会被忽略

而平常的function(){}则是一种声明式,如果加上()括号后,则会被编译器认为是函数表达式,(加上+-号都可以),从而可以用()来直接调用

(functionfn1(){})();

解释:包围函数(function(){})的第一对括号向脚本返回未命名的函数,随后一对空括号立即执行返回的未命名函数,括号内为匿名函数的参数。

作用:可以用它创建命名空间,只要把自己所有的代码都写在这个特殊的函数包装内,那么外部就不能访问,除非你允许(变量前加上window,这样该函数或变量就成为全局)。

各JavaScript库的代码也基本是这种组织形式。

总结一下,执行函数的作用主要为匿名 和 自动执行,代码在被解释时就已经在运行了。

你可能感兴趣的:(js循环绑定事件在编写JS代码的时候,我们经常会遇到要对一系列元素进行事件绑定的情况,然后就会理所当然的开一个for循环,对元素的事件进行赋值等操作,最后运行的效果却不是希望有的样子,事件的响应...)