问题1.
如题,通过js绑定click事件,无限调用。
js 结构
window.onload = function(){
basecss();
bdEvent()
function bdEvent(){
var li=document.querySelectorAll("#slider li");
li[0].addEventListener("click", before(),true);
li[1].addEventListener("click", before(),true);
li[3].addEventListener("click", before(),true);
li[4].addEventListener("click", before(),true);
}
function basecss(){
...
};
function before(){
...
};
function next(){
...
};
}
html结构
<body>
<div id="slider">
<ul>
<li>
<img src="1517301943(1).jpg">
<a>0000</a>
</li>
<li>
<img src="1.jpg">
<a>0000</a>
</li>
<li>
<img src="1.jpg">
<a>0000</a>
</li>
<li>
<img src="1.jpg">
<a>0000</a>
</li>
<li>
<img src="1.jpg">
<a>0000</a>
</li>
</ul>
</div>
</body>
问题2.
定义一个变量,然后写一个函数不能调用?我调用a是undefine
window.onload = function(){
basecss();
bdEvent();
var a="aaa";
function bdEvent(){
alert(a);
}
事件绑定错了,去掉(),加()是将before返回值作为click的处理函数,至于无限调用自己检查逻辑,肯定是有死循环代码了
li[0].addEventListener("click", before(),true);
==>
li[0].addEventListener("click", before,true);
var申明的变量不管你在哪里var,预解析,会在作用域最先申明并赋值为undefined,只有执行到实际的赋值语句才会赋值,所以undefined没错,等价于下面的
window.onload = function () {
var a = undefined;////////////////
basecss();
bdEvent();//执行alert a,所以undefined,也不会报错
a = "aaa";//执行到这才会赋值
function bdEvent() {
alert(a);
}
}
第一个问题是 你自己写的函数全部包裹再一期,肯定全部都调用了呀。。。
第二个问题。你先调用函数 再去赋值 肯定是没有的 你需要写下面
window.onload = function(){
basecss();
var a="aaa";
function bdEvent(){
alert(a);
}
bdEvent();
问题1, 绑定事件错了, 不要加(), 加上()会立即调用;
问题2 bdEvent调用时变量a已经提升但是未赋值, 所以不抱错,弹出的是undefined
不懂再问
li[0].addEventListener("click", before(),true);
li[1].addEventListener("click", before(),true);
li[3].addEventListener("click", before(),true);
li[4].addEventListener("click", before(),true);
你这个里面会执行函数,知道不;
js里面()表示执行函数;
所以你要绑定事件的话,需要去掉(),就相当于引用;
li[0].addEventListener("click", before,true);
li[1].addEventListener("click", before,true);
li[3].addEventListener("click", before,true);
li[4].addEventListener("click", before,true);
这里可以写循环的;
2.函数要有调用才会触发,你的第二个问题中,那个bdEvent只是定义了一下,并没有调用方啊;
所以你可以在定义后面执行,如bdEvent(),bdEvent.call()等;
或者定义自运行函数;
希望可以帮到你
注意js的生命周期,结构都是从上往下的,你开始就调用函数,但那时函数还没定义,肯定不行的。
还有就是,多在浏览器中F12调试js,可以利用浏览器输出Console协助调试,很方便的!
加油,js很好学的,功能又很强。
第一个问题: 我测试的并不是无限调用,只调用了4次;打印了4个before;刚好对应你的4个li。
window.onload = function(){
basecss();
bdEvent();
function bdEvent(){
var li=document.querySelectorAll("#slider li");
li[0].addEventListener("click", before(),true);
li[1].addEventListener("click", before(),true);
li[3].addEventListener("click", before(),true);
li[4].addEventListener("click", before(),true);
}
function basecss(){
console.log("basecss");
};
function before(){
console.log("before");
};
function next(){
console.log("next");
};
}
第二个问题: 这是js的运行顺序问题。
js的运行是自上而下的运行,当他遇到方法时,会先进入方法内运行,运行完方法中的代码,再继续向下执行。
而你的var a="aaa"在方法bdEvent();的调用之后才定义的,此时js是没有运行到你的变量定义的地方的,因此alert的是undefine;
如果你变化一下顺序 将 var a="bbb"放在bdEvent()的上面,就会打印a
$(function(){
function basecss(){
console.log("basecss");
};
basecss();
bdEvent();
var a="bbbbb";
alert(a);
function bdEvent(){
//var a="bbbbb";
alert(a);
}
});
然而 如果你这样写
它的打印顺序是 undefinehello-> bbbb->bbbbworld;为什么在调用之前 定义了a,此时又打印undefine呢?因为
js作用域链的访问规则,当前作用域内存在要访问的变量a,所以使用当前作用域中的变量。再根据js代码的执行顺序,此时的a只是声明了而并未被赋值,默认为undefined,所以输出undefined。
而第二个a,输出bbbbb,正是因为此时的a已经被声明且被赋值,所以a输出bbbb
另外 建议你用jquery,别用window.onload()了
$(function(){
function basecss(){
console.log("basecss");
};
basecss();
var a="bbbbb";
bdEvent();
alert(a+"world");
function bdEvent(){
alert(a+"hello");
var a="bbbbb";
alert(a);
}
});
第一个没看懂你要表达什么。。。
第二个,定义变量的顺序不对,先定义变量在调用函数
bdEvent 在调用之前还未定义
js在调用的时候会从上往下自行调用,如果没有被和声明赋值的变量在js中是不会报错的,js中加入了大量的预赋值。运行到before时还没有给变量a赋值。所以会是undefine的。循环调用时不会的,因为你在注册click事件的时候用的before()方法的调用不是声明。所以会调用四次。不会无限循环下去的
绑定事件错了, 不要加(), 加上()会立即调用;
问题1.
li[0].addEventListener("click", before(),true);
li[1].addEventListener("click", before(),true);
li[3].addEventListener("click", before(),true);
li[4].addEventListener("click", before(),true);
绑定方法写错了:
li[0].addEventListener("click", before,true);
问题2.
window.onload = function(){
basecss();
bdEvent();
var a="aaa";
function bdEvent(){
alert(a);
}
这个方法之所以调用的时候a是undefined是因为方法调用时你的a还没有初始化
window.onload = function(){
basecss();
//先初始化
var a="aaa";
//调用
bdEvent();
function bdEvent(){
alert(a);
}