call() 方法调用一个函数, 其具有一个指定的 this值和参数列表
语法:函数.call(指向的对象,参数1,参数2)
call的性能要比apply好一些
2)apply:
apply()方法调用一个函数, 其具有一个指定的 this 值,以及作为一个数组
语法:语法:函数.call(指向的对象,[参数1,参数2])
3)bind:
bind() 函数会创建一个新函数,新函数与被调函数具有相同的函数体,当目标函数被调用时 this 值绑定到 bind() 的第一个参数,该参数不能被重写。
3、闭包
1)什么是闭包:
闭包是指有权访问另一个函数作用域中的变量的函数
2)闭包的作用:
-
在外部访问函数内部的变量
-
让函数内的局部变量可以一直保存下去,不会被垃圾回收机制回收
-
模块化私有属性和公共属性
3)闭包的原理:
全局变量生存周期是永久,局部变量生存周期随着函数的调用结束而销毁,但是,闭包的情况不一样:在另一个函数内部定义的函数会将包含外部函数的活动对象添加到它的作用域链中,函数执行完毕后,其活动对象也不会被销毁,因为内部函数的作用域链仍然在引用这个活动对象。所以当函数执行完毕后,只是执行的作用域链会被销毁,但它的活动对象仍然保留在内存中,直到内部函数被销毁后才销毁。
4)闭包的优缺点
优点:
保护私有上下文中的"私有变量" 和 外界互不影响
私有上下文中的“私有变量”和“值”都会被保存起来,可以供其下级上下文中使用
缺点:
如果使用闭包,会导致栈内存太大,页面渲染变慢,性能受到影响
优化:
由于闭包会一直占用内存空间,直到页面销毁,我们可以主动将已使用的闭包销毁:
将闭包函数赋值为null 可以销毁闭包
5)闭包遇到的问题
多个子函数的[[scope]]都是同时指向父级,是完全共享的。因此当父级的变量对象被修改时,所有子函数都受到影响。
解决:
变量可以通过 函数参数的形式 传入,避免使用默认的[[scope]]向上查找
使用setTimeout包裹,通过第三个参数传入
使用 块级作用域,让变量成为自己上下文的属性,避免共享
6)闭包的应用场景
1、数组对象进行排序
let lessons = [
{
title: “Nodejs快速入门”,
click: 100,
price: 3200
},
{
title: “html+css”,
click: 100,
price: 1200
},
{
title: “js入门到精通”,
click: 2100,
price: 2000
}
];
function myOrder(field) {
return (a, b) => a[field] - b[field];
}
lessons.sort(myOrder(“price”))
2、对列表元素绑定事件
for (var i = 0; i < liList.length; i++) {
liList[i].onclick = (function (i) {
return function () {
console.log(当前点击按钮的索引:${i}
)
}
})(i)
}
3、闭包实现模块化 保护
var myModule = (function () {
var name = ‘张三’
function getName() { return name }
return {
getName
}
})()
4、返回值 最常见的一种形式
var fun_1 = function () {
var name = “limo”;
return function () {
return name;
}
}
5、 getter和setter
var getValue, setValue;
(function () {
var num = 0
getValue = function () {
return num
}
setValue = function (v) {
if (typeof v === ‘number’) {
num = v
}
}
})();
console.log(getValue()); //0
setValue(10);
console.log(getValue()) //10
4、原型
原型:
在 js 中我们是使用构造函数来新建一个对象的,每一个构造函数的内部都有一个 prototype 属性值,这个属性值是一个对象,这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法,简单来说,该函数实例化的所有对象的__proto__的属性指向这个对象,它是该函数所有实例化对象的原型。
使用原型对象为多个对象共享属性或方法,这样可以解决通过构建函数创建对象时复制多个函数造成的内存占用问题
以下函数没有prototyoe:
使用Function.prototype.bind创建的函数对象
function abc(){console.log(‘abc’)}
var binded = abc.bind(null)
binded() //abc
console.log(binded.prototype) //undefined
箭头函数也没有
var abc = ()=>{console.log(‘abc’)}
abc() //abc
console.log(abc.prototype) //undefined
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
Vue 编码基础
2.1.1. 组件规范
2.1.2. 模板中使用简单的表达式
2.1.3 指令都使用缩写形式
2.1.4 标签顺序保持一致
2.1.5 必须为 v-for 设置键值 key
2.1.6 v-show 与 v-if 选择
2.1.7 script 标签内部结构顺序
2.1.8 Vue Router 规范
Vue 项目目录规范
2.2.1 基础
2.2.2 使用 Vue-cli 脚手架
2.2.3 目录说明
2.2.4注释说明
2.2.5 其他
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
2.1.3 指令都使用缩写形式
2.1.4 标签顺序保持一致
2.1.5 必须为 v-for 设置键值 key
2.1.6 v-show 与 v-if 选择
2.1.7 script 标签内部结构顺序
2.1.8 Vue Router 规范
Vue 项目目录规范
2.2.1 基础
2.2.2 使用 Vue-cli 脚手架
2.2.3 目录说明
2.2.4注释说明
2.2.5 其他