let与var的区别,Ajax过程,call()、apply()、bind()的区别与用法

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继续往下执行

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值