从两个名词说起
1.表达式:js 中的一个短语,js 解释器会将其计算出一个结果。程序中的常量是最简单的一类表达式。
2.语句:js 整句或命令。js语句是以分号结束;表达式计算出一个值,但语句用来自行以使某件事发生。
立即执行函数:
也叫匿名自执行函数,是一个可以自己自动执行的函数,不需要借助其他元素。
基本结构:
(function(){
//方法内容
})()
或
(function(){
//方法内容
}())
解释:function{…}是一个匿名函数,包围它的一对括号将其转换为一个表达式,紧跟其后的一对括号调用了这个函数。立即执行函数也可以理解为立即调用一个匿名函数。立即执行函数最常见的应用场景就是:将var变量的作用域限制于你们函数内,这样可以避免命名冲突。(用一个括号将function包裹是js语法限制规则)
闭包:
重用一个对象,又保护对象不被篡改的一种机制。
基本结构:
function a(){
var i =0;
function b(){
alert(++i);
}
return b;
}
var c = a();
c();
解释:在构造函数体内定义另外的函数作为目标对象的方法函数,而这个对象的方法函数反过来引用外层函数体中的临时变量。这使得只要目标 对象在生存期内始终能保持其方法,就能间接保持原构造函数体当时用到的临时变量值。
更直白的:当函数a的内部函数b被函数a外的一个变量c引用的时候,Javascript的垃圾回收机制GC不会收回a所占用的资源,因为a的内部函数b的执行需要依赖a中的变量。
事件冒泡问题:
两个概念:
事件捕获(event capturing):通俗的理解就是,当鼠标点击或者触发dom事件时,浏览器会从根节点开始由外到内进行事件传播,即点击了子元素,如果父元素通过事件捕获方式注册了对应的事件的话,会先触发父元素绑定的事件。
事件冒泡(dubbed bubbling):与事件捕获恰恰相反,事件冒泡顺序是由内到外进行事件传播,直到根节点。
事件传播中一般默认的是事件冒泡。
简单结构:
<div class="div1" onclick="test()">
<div class="div2" onclick="test1()">
</div>
</div>
问题:当子div被点击时,子父div的onclick方法都会被触发,有时候我们要避免这样的情况
解决办法:在子div的test1()方法中加:
1.event.cancelBubble = true;
2.event.stopPropagation();
这两种方法在chrome中都可以使用,效果一样。