前端知识点(五)——js

1,说说严格模式的限制

严格模式主要有以下限制:

变量必须声明后再使用

函数的参数不能有同名属性,否则报错

不能使用with语句

不能对只读属性赋值,否则报错

不能使用前缀0表示八进制数,否则报错

不能删除不可删除的属性,否则报错

不能删除变量delete prop,会报错,只能删除属性delete global[prop]

eval不会在它的外层作用域引入变量

eval和arguments不能被重新赋值

arguments不会自动反映函数参数的变化

不能使用arguments.callee

不能使用arguments.caller

禁止this指向全局对象

不能使用fn.caller和fn.arguments获取函数调用的堆栈

增加了保留字(比如protected、static和interface)

设立"严格模式"的目的,主要有以下几个:

消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;

消除代码运行的一些不安全之处,保证代码运行的安全;

提高编译器效率,增加运行速度;

为未来新版本的Javascript做好铺垫。

注:经过测试IE6,7,8,9均不支持严格模式。

2,attribute和property的区别是什么?

attribute是dom元素在文档中作为html标签拥有的属性;

property就是dom元素在js中作为对象拥有的属性。

所以:

对于html的标准属性来说,attribute和property是同步的,是会自动更新的,

但是对于自定义的属性来说,他们是不同步的,

3,offsetWidth/offsetHeight,clientWidth/clientHeight与scrollWidth/scrollHeight的区别,

offsetWidth/offsetHeight返回值包含content + padding + border,效果与e.getBoundingClientRect()相同

clientWidth/clientHeight返回值只包含content + padding,如果有滚动条,也不包含滚动条

scrollWidth/scrollHeight返回值包含content + padding + 溢出内容的尺寸

33,focus/blur与focusin/focusout的区别与联系

focus/blur不冒泡,focusin/focusout冒泡

focus/blur兼容性好,focusin/focusout在除FireFox外的浏览器下都保持良好兼容性,如需使用事件托管,可考虑在FireFox下使用事件捕获elem.addEventListener('focus', handler, true)

可获得焦点的元素:

window

链接被点击或键盘操作

表单空间被点击或键盘操作

设置tabindex属性的元素被点击或键盘操作

4,mouseover/mouseout与mouseenter/mouseleave的区别与联系

mouseover/mouseout是标准事件,所有浏览器都支持;mouseenter/mouseleave是IE5.5引入的特有事件后来被DOM3标准采纳,现代标准浏览器也支持

mouseover/mouseout是冒泡事件;mouseenter/mouseleave不冒泡。需要为多个元素监听鼠标移入/出事件时,推荐mouseover/mouseout托管,提高性能

标准事件模型中event.target表示发生移入/出的元素,vent.relatedTarget对应移出/如元素;在老IE中event.srcElement表示发生移入/出的元素,event.toElement表示移出的目标元素,event.fromElement表示移入时的来源元素

5,检测浏览器版本版本有哪些方式?

根据 navigator.userAgent // UA.toLowerCase().indexOf('chrome')

根据 window 对象的成员 // 'ActiveXObject' in window

6,描述浏览器的渲染过程,DOM树和渲染树的区别?

浏览器的渲染过程:

解析HTML构建 DOM(DOM树),并行请求 css/image/js

CSS 文件下载完成,开始构建 CSSOM(CSS树)

CSSOM 构建结束后,和 DOM 一起生成 Render Tree(渲染树)

布局(Layout):计算出每个节点在屏幕中的位置

显示(Painting):通过显卡把页面画到屏幕上

DOM树 和 渲染树 的区别:

DOM树与HTML标签一一对应,包括head和隐藏元素

渲染树不包括head和隐藏元素,大段文本的每一个行都是独立节点,每一个节点都有对应的css属性

7,重绘和回流(重排)的区别和关系?

重绘:当渲染树中的元素外观(如:颜色)发生改变,不影响布局时,产生重绘

回流:当渲染树中的元素的布局(如:尺寸、位置、隐藏/状态状态)发生改变时,产生重绘回流

注意:JS获取Layout属性值(如:offsetLeft、scrollTop、getComputedStyle等)也会引起回流。因为浏览器需要通过回流计算最新值

回流必将引起重绘,而重绘不一定会引起回流

8,如何最小化重绘(repaint)和回流(reflow)?

需要要对元素进行复杂的操作时,可以先隐藏(display:"none"),操作完成后再显示

需要创建多个DOM节点时,使用DocumentFragment创建完后一次性的加入document

缓存Layout属性值,如:var left = elem.offsetLeft; 这样,多次使用 left 只产生一次回流

尽量避免用table布局(table元素一旦触发回流就会导致table里所有的其它元素回流)

避免使用css表达式(expression),因为每次调用都会重新计算值(包括加载页面)

尽量使用 css 属性简写,如:用 border 代替 border-width, border-style, border-color

批量修改元素样式:elem.className 和 elem.style.cssText 代替 elem.style.xxx

9,script 的位置是否会影响首屏显示时间?

在解析 HTML 生成 DOM 过程中,js 文件的下载是并行的,不需要 DOM 处理到 script 节点。因此,script的位置不影响首屏显示的开始时间。

浏览器解析 HTML 是自上而下的线性过程,script作为 HTML 的一部分同样遵循这个原则

因此,script 会延迟 DomContentLoad,只显示其上部分首屏内容,从而影响首屏显示的完成时间

10,介绍DOM0,DOM2,DOM3事件处理方式区别

DOM0级事件处理方式:

btn.onclick = func;

btn.onclick = null;

DOM2级事件处理方式:

btn.addEventListener('click', func, false);

btn.removeEventListener('click', func, false);

btn.attachEvent("onclick", func);

btn.detachEvent("onclick", func);

DOM3级事件处理方式:

eventUtil.addListener(input, "textInput", func);

eventUtil 是自定义对象,textInput 是DOM3级事件

11,事件的三个阶段

捕获、目标、冒泡

js的冒泡(Bubbling Event)和捕获(Capture Event)的区别

冒泡型事件:事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发。

捕获型事件(event capturing):事件从最不精确的对象(document 对象)开始触发,然后到最精确(也可以在窗口级别捕获事件,不过必须由开发人员特别指定)。

DOM事件流:同时支持两种事件模型:捕获型事件和冒泡型事件,但是,捕获型事件先发生。两种事件流会触及DOM中的所有对象,从document对象开始,也在document对象结束。

事件捕获

当你使用事件捕获时,父级元素先触发,子级元素后触发,即div先触发,p后触发。

事件冒泡

当你使用事件冒泡时,子级元素先触发,父级元素后触发,即p先触发,div后触发。

阻止冒泡

• 在W3c中,使用stopPropagation()方法

• 在IE下设置cancelBubble = true;

在捕获的过程中stopPropagation();后,后面的冒泡过程也不会发生了。

阻止捕获

阻止事件的默认行为,例如click 后的跳转

• 在W3c中,使用preventDefault()方法;

• 在IE下设置window.event.returnValue = false;

12,介绍事件“捕获”和“冒泡”执行顺序和事件的执行次数?

按照W3C标准的事件:首是进入捕获阶段,直到达到目标元素,再进入冒泡阶段

事件执行次数(DOM2-addEventListener):元素上绑定事件的个数

注意1:前提是事件被确实触发

注意2:事件绑定几次就算几个事件,即使类型和功能完全一样也不会“覆盖”

事件执行顺序:判断的关键是否目标元素

非目标元素:根据W3C的标准执行:捕获->目标元素->冒泡(不依据事件绑定顺序)

目标元素:依据事件绑定顺序:先绑定的事件先执行(不依据捕获冒泡标准)

最终顺序:父元素捕获->目标元素事件1->目标元素事件2->子元素捕获->子元素冒泡->父元素冒泡

注意:子元素事件执行前提 事件确实“落”到子元素布局区域上,而不是简单的具有嵌套关系

在一个DOM上同时绑定两个点击事件:一个用捕获,一个用冒泡。事件会执行几次,先执行冒泡还是捕获?

该DOM上的事件如果被触发,会执行两次(执行次数等于绑定次数)

如果该DOM是目标元素,则按事件绑定顺序执行,不区分冒泡/捕获

如果该DOM是处于事件流中的非目标元素,则先执行捕获,后执行冒泡

13,什么是函数节流?介绍一下应用场景和原理?

函数节流(throttle)是指阻止一个函数在很短时间间隔内连续调用。 只有当上一次函数执行后达到规定的时间间隔,才能进行下一次调用。 但要保证一个累计最小调用间隔(否则拖拽类的节流都将无连续效果)

函数节流用于 onresize, onscroll 等短时间内会多次触发的事件

函数节流的原理:使用定时器做时间节流。 当触发一个事件时,先用 setTimout 让这个事件延迟一小段时间再执行。 如果在这个时间间隔内又触发了事件,就 clearTimeout 原来的定时器, 再 setTimeout 一个新的定时器重复以上流程。

函数节流简单实现:

function throttle(method, context) {

 clearTimeout(methor.tId);

 method.tId = setTimeout(function(){

     method.call(context);

 }, 100); // 两次调用至少间隔 100ms

}

// 调用

window.onresize = function(){

throttle(myFunc, window);

}

14,new 操作符具体干了什么?

创建实例对象,this 变量引用该对象,同时还继承了构造函数的原型

属性和方法被加入到 this 引用的对象中

新创建的对象由 this 所引用,并且最后隐式的返回 this

15,JavaScript实现异步编程的方法?

回调函数

事件监听

发布/订阅

Promises对象

Async函数[ES7]

16,web开发中会话跟踪的方法有哪些

cookie

session

url参数传递

隐藏input

ip地址

posted @   梦想三旬  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示