前端开发总结(一)

165 阅读4分钟

防止重复发送Ajax请求

方案:函数防抖+用户点击之后按钮disabled+函数节流

  • 1、使用防抖函数限定在一定时间内连续地点击只有第一次是有效的。
  • 2、如果后台请求处理很慢,第一次有效请求发送过去后后台在处理,直到第二次有效请求还没处理完,这时后台可能会发生错误,解决办法,第一次请求过后就把点击按钮disabled,直到请求响应之后才enable。
  • 3、如果后台处理很快,多次点击都是有效的且能及时处理,但是并不需要这么多请求(比如查询请求,其实都是一个结果,没必要重复请求,可能是用户无意多点了,也可能是用户无聊故意多点了,也有可能是恶意攻击),这时就取一个请求间隔时间,比如5s(不同请求可以设置不同值)。
  • 4、所以最终取设定时间与后台处理返回时间的更大值即可。

闭包

  • 闭包是javascript支持头等函数的一种方式,它是一个能够引用其内部作用域变量(在本作用域第一次声明的变量)的表达式,这个表达式可以赋值给某个变量,可以作为参数传递给函数,也可以作为一个函数返回值返回。
  • 闭包是函数开始执行的时候被分配的一个栈帧,在函数执行结束返回后仍不会被释放(就好像一个栈帧被分配在堆里而不是栈里!)
  • 闭包的应用:
    • 比如写柯里化函数的时候利用闭包,保存参数在内存中:
    var currying = function(fun) {
        //格式化arguments
        var args = Array.prototype.slice.call(arguments, 1);
        return function() {
            //收集所有的参数在同一个数组中,进行计算
            var _args = args.concat(Array.prototype.slice.call(arguments));
            return fun.apply(null, _args);
        };
    }
    
    • 模拟私有变量或是私有方法:
    const people = (num) => {
        var num = num;
        return {
    	increase: () => {
    	    num++;
            },
            get: () => {
                return num;
            }
        }
    }
    const man = people(4);
    man.increase();
    man.get();
    
    • 避免引用错误:
    for (var i = 0; i < 4; i++) {
        (function(_i) {
        	setTimeout(function() {
      		    console.log(_i)
    	    }, 1000)
        })(i)
    }
    

new 关键字过程

  • 创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型。
  • 属性和方法被加入到 this 引用的对象中。
  • 新创建的对象由 this 所引用,并且最后隐式的返回 this 。

伪代码如下:

var obj = {};
obj.__proto__ = Foo.prototype; //Foo为构造函数
Foo.call(obj);
retun obj;

TCP vs UDP

  • TCP面向连接(确认有创建三方交握,连接已创建才作传输。)
  • UDP不是面向连接的,UDP传送数据前并不与对方建立连接,对接收到的数据也不发送确认信号,发送端不知道数据是否会正确接收,当然也不用重发,所以说UDP是无连接的、不可靠的一种数据传输协议。
  • UDP传输速率更高,因为不必确认收发数据,实时性更好
  • TCP数据是有序的,以什么顺序发送的数据,接收时同样会按照此顺序;UDP是无序的,发出(1,2,3),有可能按照(1,3,2)的顺序收到。应用程序必须自己做分组排序。

TCP不会丢包的机制实现

TCP是通过序列号确认号和计时器来检测丢包和保证数据顺序的。使用校验和来检测报文段的错误。

  • 1、发送方首先发送第一个包含序列号为1(可变化)和1460字节数据的TCP报文段给接收方。接收方以一个没有数据的TCP报文段来回复(只含报头),用确认号1461来表示已完全收到并请求下一个报文段。
  • 2、发送方然后发送第二个包含序列号为1461和1460字节数据的TCP报文段给接收方。正常情况下,接收方以一个没有数据的TCP报文段来回复,用确认号2921(1461+1460)来表示已完全收到并请求下一个报文段。发送接收这样继续下去。
  • 3、然而当这些数据包都是相连的情况下,接收方没有必要每一次都回应。比如,他收到第1到5条TCP报文段,只需回应第五条就行了。在例子中第3条TCP报文段被丢失了,所以尽管他收到了第4和5条,然而他只能回应第2条。
  • 4、发送方在发送了第三条以后,没能收到回应,因此当时钟(timer)过时(expire)时,他重发第三条。(每次发送者发送一条TCP报文段后,都会再次启动一次时钟:RTT)。
  • 5、这次第三条被成功接收,接收方可以直接确认第5条,因为4,5两条已收到。