question1
以下代码执行后,console 的输出是?
let x = 10;
let foo = () => {
console.log(x);
let x = 20;
x++;
}
foo()
正确答案: A, 你的答案: D (错误)
解析:一楼的回答说:”let块级作用域,所以不会去访问外部的x“
是错误的,这题的本质是暂时死区的问题
如图,我单单是去掉了在function中let的定义
这里边的console.log的结果是1,证明了是可以访问function之前定义的变量的,
而之所以会产生reference error是因为暂时死区的问题(temperal dead zone),我为此查了下红宝书第四版P25
,
就是说虽然let语句不像var语句会产生hoisting(变量提升),JavaScript引擎也会意识到在后边的let定义,只是不支持在let声明语句之前引用该变量而已。所以,只要在同一个block中,let是在后边定义的,就不能在之前引用该变量。与此同时,也不能再去取嵌套外层的值了(x=1)
总结:let :1.不存在变量提升
2.暂时性死区,使用let命令声明变量之前,该变量都是不可用的
3.不允许重复声明,不允许在相同作用域内,重复声明同一个变量
question2
在准备XMLHttpRequest对象时,在send()前需要调用哪个方法?
prepare ()
open ()
init ()
build ()
正确答案: B 你的答案: B (正确)
解析:
Ajax技术核心就是XMLHttpRequest对象。
Ajax技术的工作原理:可以分成3步
1.创建Ajax对象:var xhr = new XMLHttpRequest();
2.xhr 发送请求:xhr.open('get','test.html','true');
xhr.send();
3.xhr获取响应:
xhr.onreadystatechange = function(){
if(xhr.readystate == 4){//请求的状态码
/*
0:请求还没有建立(open执行前)
1:请求建立了还没发送(执行了open)
2:请求正式发送(执行了send)
3:请求已受理,有部分数据可以用,但还没有处理完成
4:请求完全处理完成
*/
alert(xhr.response.data);//返回的数据
}
}
可以看到,send()前是open()
question3
你想通过 XMLHttpRequest更新以下元素,即通过div显示状态,哪个是正确的做法?
<div id="statusCode"></div>
var myDiv = document.getElementById ("statusCode"); myDiv.innerHTML = req.statusCode;
var myDiv = document.getElementById ("statusCode"); myDiv.innerHTML = req.status;
var myDiv = document.getElementById ("statusCode"); myDiv.setStatus (req.statusCode);
var myDiv = document.getElementById ("statusCode"); myDiv.status = req.status;
正确答案: B 你的答案: B (正确)
解析:XMLHttpRequest对象的readyState与status的几种状态码表示的意思:
readyState有五种状态:
0 (未初始化): (XMLHttpRequest)对象已经创建,但还没有调用open()方法;
1 (载入):已经调用open() 方法,但尚未发送请求;
2 (载入完成): 请求已经发送完成;
3 (交互):可以接收到部分响应数据;
4 (完成):已经接收到了全部数据,并且连接已经关闭。
status实际是一种辅状态判断,只是status更多是服务器方的状态判断。
关于status,由于它的状态有几十种,我只列出平时常用的几种:
1xx——信息类,表示收到Web浏览器请求,正在进一步的处理中。如,100:客户必须继续发出请求;101:客户要求服务器根据请求转换HTTP协议版本
2xx——成功,表示用户请求被正确接收,理解和处理。例如,200:OK;201:提示知道新文件的URL
3xx——重定向,表示请求没有成功,客户必须采取进一步的动作。如,300:请求的资源可在多处得到;301:删除请求数据
4xx——客户端错误,表示客户端提交的请求有错误。如,404:NOT Found,意味着请求中所引用的文档不存在。
5xx——服务器错误,表示服务器不能完成对请求的处理。如,500,服务器产生内部错误
question4
var a = [1,4,5,2,9];
下面求a中最大值正确的是
A.Math.max(a)
B.Array.max(a)
C.Math.max.call(null,a)
D.Math.max.apply(null,a)
E.以上均不是
正确答案: D 你的答案: A (错误)
解析:Math.max方法不能传入一个数组,只能传入多个number参数,而apply相当于一个中间过渡把数组a的每一个元素传递到max()里面。
扩展:call()、apply()、bind()的区别与用法:https://www.runoob.com/w3cnote/js-call-apply-bind.html
question5
执行以下程序段后,x的值是( )。
var x=0;
switch(++x)
{
case 0: ++x;
case 1: ++x;
case 2: ++x;
}
A.1 B.2 C.3. D.4
正确答案: C 你的答案: C (正确)
解析:没有break, 从case1继续往下执行