html通过js绑定click事件,无限调用。

问题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);
        }
    }

=>javascript运行机制浅析

第一个问题是 你自己写的函数全部包裹再一期,肯定全部都调用了呀。。。
第二个问题。你先调用函数 再去赋值 肯定是没有的 你需要写下面
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);
}