7.1 如何理解函数声明提升?
执行代码之前会读取函数声明,这意味着可以把函数声明放在调用它语句的后面。
7.2 匿名函数的name属性是?
空字符串
7.3 怎样实现对函数的递归调用最安全?
最好使用命名函数表达式,因为使用函数声明时进行引用赋值时,一旦将原来的函数名设置为null,就会导致错误;而使用arguments.callee代替函数名进行递归调用,在严格模式会不允许。
7.4什么是闭包?
闭包是指有权访问另一个函数作用域中变量的函数。
7.5创建闭包的常见方式?
在一个函数内部创建另一个函数。
7.6函数第一次调用时发生了什么?
创建一个执行环境及相应的作用域链,并把作用域链赋值给一个特殊的内部属性[[scope]],然后使用this,arguments和其他命名参数值来初始化函数的活动对象。
7.7作用域链的本质是?
一个指向变量对象的指针列表,它只引用但不实际包含变量对象。
7.8为何建议只在绝对必要时在考虑闭包?
闭包换携带包含它的函数的作用域,因此会比其他函数占用更多的内存,过度使用闭包会导致内存占用过多。
7.9匿名函数的this指向?
Window,因为它的执行环具有全局性。
7.10函数被调用时,其活动对象自动获取的特殊变量有?
this和arguments。
7.11闭包的副作用有?
只能取得函数中任何变量的最后一个值;
This指向不符合预期;
容易发生内存泄漏;
7.12如何看待重复声明变量?如何解决?
对后续声明视而不见,但会执行变量的初始化;模仿块级作用域。
7.13模仿块级作用域的技术一般用在哪?
全局作用域被用在函数外部,以限制向全局作用域中添加过多的变量和函数,从而避免命名冲突。
7.14什么是单例?
只有一个实例的对象
8.1BOM的事实标准是?
浏览器之间共有的对象
8.2window对象的双重角色是?
既是JS访问浏览器窗口的接口,又是ECMAScript规定的Global对象。
8.3定义全局变量与在window对象上直接定义属性的区别?
全局变量不能通过delete操作符删除,而直接在window对象上定义的属性可以。
8.4引入self对象的目的是?
与top和parent对象对应起来。
8.5为何不建议给setTimeout()方法第一个参数传递字符串?
因为传递字符串可能导致性能损失。
8.6为何setTimeout()经过第二个参设置的时间后不一定会执行?
因为JS是一个单线程语言,一定时间内只能执行一段代码,如果任务队列为空,添加的代码会立即执行,若非空,就需要等前面的代码执行后再可执行。
8.7为何取消间歇调用比取消超时调用重要?
因为在不加干涉的情况下,间歇调用会一直执行下去
8.8为何location对象是BOM最有用的对象之一?
因为它提供了与当前窗口中加载文档的有关信息,还提供了一些导航功能。
8.9location对象有何特殊之处?
它既是window对象的属性,也是document对象的属性。
8.10为何要把reload()放在代码的最后一行?
因为位于reload()调用之后的代码可能会也可能不执行,这取决了网络延迟或系统资源等因素。
8.11BOM的对象有?
框架相关的top、parent、self对象
location对象、navigator对象、screen对象和history对象。
9.1什么时候使用客户端检测?
找不到更通用的方法之后,万不得以
9.2能力检测的目标是?
不是识别浏览器,而是识别浏览器的能力。
9.3能力检测需要注意什么?
尽量使用typeof进行检测,该特性是否按照适当方式进行。
9.4在实际开发中,如何应用能力检测?
应该将能力检测作为确定下一步解决方案的依据,而不是用来判断用户使用的是什么浏览器。
9.5怪癖检测的目标是?
识别浏览器的特殊行为,存在什么缺陷。
9.6用户代理适用的情形有?
不能直接准确使用能力检测或怪癖检测;
同一款浏览器在不同平台下具备不同的能力;
为了跟踪分析等目的。
9.7客户端检测方法有?
能力检测、怪癖检测和用户代理检测。
网友评论