JS中常见算法问题
1. 阐述JS中的变量提升(声明提前)
答:将所有的变量提升当当前作用域的顶部,赋值留在原地。意味着我们可以在某个变量声明前就使用该变量。
虽然JS会进行变量提升,但并不会执行真正的初始化过程。
按值传递:两变量间赋值,或向函数中传递参数时,都是将原变量中的值复制一个副本给对方,修改一方,另一方不受影响。
引用类型的对象之间相互赋值时,只是将地址赋值给了对方,因此改变原对象中的内容,由于地址并未发生改变,因此也会引发新变量内容的改变。
2.阐述use strict;的作用
答:指定浏览器按照严格模式去渲染。优势:强制开发者避免使用未声明的变量。对于老版本的浏览器或者执行引擎会自动忽略该指令。
3.解释什么是事件冒泡,处理方式
答:即某个事件不仅会触发当前元素,还会以嵌套顺序传递到父元素中。
关于事件流:IE提出冒泡流,即由内到外;网景提出了捕获流,即由外向内。
一个完整的JS事件流,是从window开始,最终回到window的一个过程。
事件流的三个阶段:1.捕获阶段,2.目标阶段,3.冒泡阶段。
防止冒泡和捕获:
w3c的方法是e.stopPropagation(),IE则是使用e.cancelBubble = true
```
function stopBubble(e) {
//如果提供了事件对象,则这是一个非IE浏览器
if ( e && e.stopPropagation ) {
//因此它支持W3C的stopPropagation()方法
e.stopPropagation();
} else {
//否则,我们需要使用IE的方式来取消事件冒泡
window.event.cancelBubble = true;
}
}
```
取消默认事件
w3c的方法是e.preventDefault(),IE则是使用e.returnValue = false;
```
//阻止浏览器的默认行为
function stopDefault( e ) {
//阻止默认浏览器动作(W3C)
if ( e && e.preventDefault ){
e.preventDefault();
} else {
//IE中阻止函数器默认动作的方式
window.event.returnValue = false;
}
return false;
}
```