JavaScript高频面试题,kotlin实战,大厂首发

call() 方法调用一个函数, 其具有一个指定的 this值和参数列表

语法:函数.call(指向的对象,参数1,参数2)

call的性能要比apply好一些

2)apply:

apply()方法调用一个函数, 其具有一个指定的 this 值,以及作为一个数组

语法:语法:函数.call(指向的对象,[参数1,参数2])

3)bind:

bind() 函数会创建一个新函数,新函数与被调函数具有相同的函数体,当目标函数被调用时 this 值绑定到 bind() 的第一个参数,该参数不能被重写。

在这里插入图片描述

3、闭包

1)什么是闭包:

闭包是指有权访问另一个函数作用域中的变量的函数

2)闭包的作用:

  1. 在外部访问函数内部的变量

  2. 让函数内的局部变量可以一直保存下去,不会被垃圾回收机制回收

  3. 模块化私有属性和公共属性

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前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
img

前端面试题汇总

JavaScript

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

性能

linux

前端资料汇总

de226b373d068d8f5bef31e668ce.png)

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

性能

linux

前端资料汇总

  • 28
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值