js随笔巴拉巴拉

本文概述了get和post请求参数的限制误区,强调了浏览器和服务器对URL长度的影响。深入解析了闭包的概念和其优缺点。讲解了JavaScript中类的多种继承方式,包括原型链、构造继承和组合继承。同时讨论了事件流机制和解决回调地狱的方法,以及事件委托和图片加载策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.get请求参数误区

误区:
get参数大小存在限制,post参数大小不存在限制
实际上:
http协议从未规定get和post的参数大小,
get参数受限是因为:浏览器和web服务器限制了URL长度
不同浏览器和web服务器,限制的长度不一样

2.get和post在缓存方面的区别

get可以使用缓存:因为类似查找过程,用户获取数据不用每次都与数据库连接
post不能使用缓存:做修改和删除操作,必须与数据库交互

3.说一下闭包## 标题

闭包:一个函数能读取其他函数内部的变量
原理:作用域链特性(当前执行环境下访问某个变量时,如果不存在就一直往外层查找)
优点:隐藏变量,避免全局污染(全局变量容易被人修改)
缺点:导致变量不会被垃圾回收机制回收,造成内存消耗

function Add(){
    var a = 10;
    return function(){
        a++;
        return a;
    };
};

4.类的创建和继承

创建:首先new一个function,在这个function的prototype中添加属性和方法。

//定义一个动物类
function Animal(name) {
	this.name = name;  //属性
	this.sleep = function() {   //实例方法
		console.log(this.name + 'sleep...');
	}
}
//在原型链上添加一个原型方法
Animal.prototype.eat = function(food) {
	console.log(this.name + 'eat...' + food)
}

继承:
1.原型链继承:原型链继承是JavaScript实现继承的主要方法。利用原型让一个引用类型继承另一个引用类型的属性和方法。
特点:基于原型链,既是父类的实例,也是子类的实例。
缺点:不能实现多继承。

//创建一个空对象
function Cat() {
}
Cat.prototype = new Animal();
Cat.prototype.name = 'cat';
var cat = new Cat;

2.构造继承:使用父类的构造函数来增强子类实例,等于是复制父类的实例属性给子类(没用到原型)。
特点:可以实现多继承。
缺点:只能实现继承父类的属性和方法,不能继承原型链上的属性和方法。

function Cat() {
    Animal.call(this);
    this.name = name || 'cat';
}
var cat = new Cat();

3.组合继承:相当于构造继承和原型链继承的组合体。通过调用父类构造,继承父类的属性并保留传参的优点,然后通过将父类实例作为子类原型,实现函数复用。
缺点:调用了两次父类构造函数,生成了两份实例。

function Cat() {
    Animal.call(this);
    this.name = name || 'cat';
}
(function() {
    //创建一个空对象
    var Super = function() {};
    //将实例作为子类的原型
    Super.prototype = Animal.prototype;
    Cat.prototype = new Super();
}) ()
var cat = new Cat();

4.寄生组合方式:可以说是组合继承的优化。通过寄生方式,砍掉父类的实例属性,这样,在调用两次父类的构造的时候,就不会初始化两次实例。

function Cat() {
    Animal.call(this);
    this.name = name || 'cat';
}
(function() {
    //创建一个空对象
    var Super = function() {};
    //将实例作为子类的原型
    Super.prototype = Animal.prototype;
    Cat.prototype = new Super();
}) ()
var cat = new Cat();

5.如何解决回调地狱

回调:将一个函数作为参数传给另一个函数
回调地狱:异步回调的层层嵌套
解决:async/await、promise

6.说一说事件流

事件流:页面中接收事件的顺序
事件流阶段:事件捕获、处于目标、事件冒泡
指定事件处理程序操作:addEventListener(要处理的事件名, 事件处理函数, 布尔值)
注意:参数3(布尔值)为true(表示捕获阶段调用),为false(表示冒泡阶段调用)

7.如何让事件先冒泡后捕获

监听捕获和冒泡分别对应不同的处理函数,监听到捕获事件,先暂存执行,直到冒泡事件被捕获后再执行捕获事件

8.说一下事件委托

事件委托:不是在事件发生的DOM上设置监听函数,而是在父元素上监听,通过事件冒泡,父元素可以监听到子元素的事件触发,通过判断事件发生元素DOM的类型,做出不同的响应。
举例:ul和li标签
好处:适合动态元素绑定,新添加的子元素也会有监听函数·

9.说一下图片的懒加载和预加载

预加载:提前加载图片,用户需要时从缓存中渲染(会增加服务器前端的压力)
懒加载:目的是服务器前端的优化,减少请求输或延迟请求数(缓解服务器前端压力)

10.mouseover和mouseenter起区别

mouseover:会冒泡,对应的移除事件是mouseout
mouseenter:不会冒泡,对应的移除事件是mouseleave

11.js的new操作做了哪些事

新建一个空对象,这个对象原型指向构造函数的prototype,执行构造函数后返回这个对象

12.改变函数内部this指针的指向函数(bind、apply、call的区别)

apply():第一个参数表示要指向的那个参数,第二个参数是数组
call():第一个参数表示要指向的那个参数,后面参数arg1,arg2…
bind():返回一个新的函数,不会马上执行

13.clientHeight、scrollHeight、offsetHeight的区别?offsetTop、offsetTop、clientTop的区别

clientHeight:可视区域的高度(不包含border和滚动条)
offsetHeight:可视区域的高度(包含border和滚动条)
scrollHeight:所有区域的高度(包含隐藏的部分)
clentTop:边框boder的厚度,未指定情况下为0
scrollTop:滚动后隐藏的高度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值