前端面试宝典【Javascript篇】【3】

news2024/9/21 20:30:46

在这里插入图片描述

欢迎来到《前端面试宝典》,这里是你通往互联网大厂的专属通道,专为渴望在前端领域大放异彩的你量身定制。通过本专栏的学习,无论是一线大厂还是初创企业的面试,都能自信满满地展现你的实力。

核心特色:

  • 独家实战案例:每一期专栏都将深入剖析真实的前端面试案例,从基础知识到前沿技术,从算法挑战到框架运用,让你在实战中迅速成长。
  • 深度技术解析:不再只是表面文章,我们将带你深入技术的核心,理解每一个知识点背后的原理与- - 应用场景,让你在面试中不仅知其然,更知其所以然。
  • 高质量内容保证:每一期内容都经过精心策划与打磨,确保信息的准确性和实用性,拒绝泛泛而谈,只提供真正有价值的内容。
  • 持续更新迭代:持续关注前端领域的最新动态,及时更新专栏内容,确保你始终站在技术的最前沿。

7. 异步加载JS脚本的方式有哪些?

异步加载JavaScript脚本是现代Web开发中常用的技术,它有助于改善页面加载性能,避免阻塞用户界面。以下是一些常用的异步加载JS脚本的方式:

  1. 使用<script>标签的async属性: 当async属性被设置时,脚本会被异步下载和执行,不会阻塞页面的渲染。脚本的执行顺序不受控制,即脚本可能在页面DOM构建完成之前或之后执行。
   <script src="script.js" async></script>
  1. 使用<script>标签的defer属性: defer属性同样允许脚本异步下载,但它保证脚本会在文档解析完成后,DOMContentLoaded事件触发前按照脚本在文档中的顺序执行。
   <script src="script.js" defer></script>
  1. 使用fetch或XMLHttpRequest: 可以使用HTTP请求异步获取远程脚本的内容,然后通过eval或new Function执行脚本,但这两种方法都有安全风险,不推荐使用。
   fetch('script.js')
     .then(response => response.text())
     .then(script => eval(script)); // 不推荐使用eval
   
  1. 使用importScripts: 这个方法主要用于Web Workers中,用于异步加载脚本。
   importScripts('workerScript.js');
   
  1. 使用<iframe>加载脚本: 将脚本嵌入在一个隐藏的<iframe>中,然后通过访问iframe.contentWindow或iframe.contentDocument来执行脚本。不过,这种方式可能受到同源策略的限制。
   <iframe srcdoc="<script>console.log('Script loaded');</script>" style="display:none;"></iframe>
   
  1. 使用模块加载器如Webpack、RequireJS、import()等: 这些模块加载器支持异步加载模块,可以配置为按需加载脚本,通常用于大型项目中。
<script type="module">
    import('./index.js').then((myModule) => {
        myModule.default(); // 假设index.js导出了一个默认函数
    }).catch(error => {
        console.error('Failed to load module:', error);
    });
</script>
  1. 使用动态创建<script>标签: 在运行时动态创建<script>标签并插入到DOM中,可以控制脚本的加载时机。
   const script = document.createElement('script');
   script.src = 'script.js';
   script.onload = () => {
       // 脚本加载完成后的回调
   };
   document.head.appendChild(script);
   

8. 解释一下JavaScript中的变量提升(Hoisting)

在JavaScript中,变量提升(Hoisting)是一种特殊的变量和函数声明行为。在代码执行之前,JavaScript解释器会先进行预解析(parsing)过程,这个过程中会把变量和函数声明移动到它们所在作用域的顶部。这意味着在变量或函数被实际声明之前,你就可以引用它们。但是需要注意的是,只有声明会被提升,而初始化或赋值操作则不会。
变量提升的规则:

    1. 变量声明会被提升: 如果你使用var、let或const声明变量,声明语句会被提升到作用域的顶部。但是,let和const声明的变量在它们的声明之前处于“暂时性死区”(TDZ,Temporal Dead Zone),在这个区域内访问它们会抛出引用错误。
    1. 函数声明会被完全提升: 函数不仅声明会被提升,而且函数体也会被提升,这意味着你可以在函数声明之前调用函数。
    1. 函数表达式只会提升声明: 如果你使用函数表达式(即函数赋值给一个变量),只有变量声明会被提升,函数体不会被提升。因此,在函数表达式被赋值之前尝试调用它会导致undefined引用错误。

示例:

console.log(x); // 输出: undefined
var x = 5;

console.log(y); // 输出: ReferenceError: Cannot access 'y' before initialization
let y = 5;

console.log(z); // 输出: ReferenceError: z is not defined
const z = 5;

console.log(func1()); // 输出: "Hello from func1"
function func1() {
    return "Hello from func1";
}

console.log(func2()); // 输出: TypeError: func2 is not a function
var func2 = function() {
    return "Hello from func2";
};

在上面的示例中,可以看到var x的声明被提升到了顶部,但是初始化没有提升,所以x在初始化之前是undefined。let y和const z的声明虽然也被提升,但是在声明之前访问它们会抛出错误,因为它们处于暂时性死区。函数func1的声明和函数体都被提升,所以可以直接调用。而func2的声明被提升,但是函数体没有提升,所以在初始化之前调用它会失败。
变量提升是JavaScript的一个重要特性,理解它对于避免一些常见的编程陷阱非常重要。在编写代码时,最好遵循良好的编程习惯,如在作用域的顶部声明变量,以减少因变量提升带来的潜在问题。

9. let、const、var 的区别有哪些?

在JavaScript中,var, let, 和 const 是用于声明变量的关键词,它们之间有几个重要的区别:

  1. 变量提升(Hoisting)
    var: 定义的变量会被提升至作用域的顶部,也就是说,你可以在声明之前使用变量,尽管这通常会导致undefined的值。
    let 和 const: 不会发生变量提升,你必须在使用变量之前声明它们。尝试在声明之前访问它们会导致ReferenceError,这是因为它们处于暂时性死区(TDZ)。
  2. 重新声明
    var: 允许在同一作用域内多次声明同一个变量,后面的声明会覆盖前面的声明。
    let 和 const: 不允许在相同的作用域内重复声明同一个变量,这样做会导致SyntaxError。
  3. 作用域
    var: 具有函数作用域,这意味着在函数内部声明的变量在整个函数范围内都是可见的。如果在全局作用域中声明,它会成为全局变量。
    let 和 const: 具有块级作用域,这意味着在代码块(如if语句或循环)中声明的变量只在该代码块内可见。
  4. 可变性
    var 和 let: 宣告的变量是可变的,可以重新赋值。
    const: 宣告的是常量,一旦初始化后不能重新赋值。但是,如果const变量指向一个对象或数组,那么对象或数组的内容是可以修改的,只是变量本身不能指向一个新的对象或数组。

举例说明

// 变量提升
console.log(x); // 输出 undefined
var x = 5;

// 暂时性死区
console.log(y); // 抛出 ReferenceError
let y = 5;

// 重新声明
var z = 10;
var z = 20; // z现在等于20

let a = 10;
let a = 20; // 抛出 SyntaxError

const b = 10;
const b = 20; // 抛出 SyntaxError

// 作用域
if (true) {
    var c = 10;
}
console.log(c); // 输出 10

if (true) {
    let d = 10;
}
console.log(d); // 抛出 ReferenceError

// 可变性
let e = [1, 2, 3];
e.push(4); // 数组内容改变,e仍然是原来的数组

const f = [1, 2, 3];
f.push(4); // 数组内容改变,f仍然是原来的数组
f = [5, 6]; // 抛出 TypeError

总结来说,var主要用于旧的JavaScript代码中,而let和const则在ES6及以后的代码中更为常见,它们提供了更安全和灵活的变量管理方式。在现代JavaScript开发中,推荐使用let和const。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1947148.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大语言模型-GPT2-Generative Pre-Training2

一、背景信息&#xff1a; GPT2是2019年由OpenAI 提出的预训练语言模型。 GPT2提出语言模型式无监督的多任务学习 。旨在通过无监督学习也能达到和finetune一样的效果&#xff0c;并且拥有更强的泛化能能力。 即提出利用语言模型做下游任务时&#xff0c;不需要下游任务的任何…

Ubuntu 22.04如何设置中文输入法

前言 近期整理了一下之前在ubuntu 22.04 中如何设置中文输入法的过程&#xff0c;对于本人比较适应读中文写中文来说&#xff0c;这是我安装后的第一步。 一、流程 1.1 安装中文语言包&#xff08;如果还未安装&#xff09; 首先是安装中文语言包&#xff0c;直接在终端输入…

Elasticsearch集群配置-节点职责划分 Hot Warm 架构实践

前言 本文主要讲了ES在节点部署时可以考虑的节点职责划分&#xff0c;如果不考虑节点部署&#xff0c;那么所有节点都会身兼数职&#xff08;master-eligible &#xff0c;data&#xff0c;coordinate等&#xff09;&#xff0c;这对后期的维护拓展并不利&#xff0c;所以本文…

SSRF中伪协议学习

SSRF常用的伪协议 file:// 从文件系统中获取文件内容,如file:///etc/passwd dict:// 字典服务协议,访问字典资源,如 dict:///ip:6739/info: ftp:// 可用于网络端口扫描 sftp:// SSH文件传输协议或安全文件传输协议 ldap://轻量级目录访问协议 tftp:// 简单文件传输协议 gopher…

算法——滑动窗口(day8)

30.串联所有单词的子串 30. 串联所有单词的子串 - 力扣&#xff08;LeetCode&#xff09; 必看&#xff01;&#xff01;&#xff01;本题是我们上次写的438.异位词的进阶版&#xff0c;可参考本篇文章&#xff1a;算法——滑动窗口&#xff08;day7&#xff09;-CSDN博客来…

c++笔记2

目录 2.2 栈底&#xff08;bottom&#xff09; } 大数乘大数 节点&#xff1a;包含一个数据元素及若干指向子树分支的信息 。 节点的度&#xff1a;一个节点拥有子树的数目称为节点的度 。 叶子节点&#xff1a;也称为终端节点&#xff0c;没有子树的节点或者度为零的节点…

vue3+openLayers触摸事件显示弹窗

<template><!--地图--><div class"distributeMap" id"distributeMap"></div><!--弹窗--><section ref"popup" id"popupDiv" class"popup">{{ state.popupParams.name }}</section&g…

OpenGauss和GaussDB有何不同

OpenGauss和GaussDB是两个不同的数据库产品&#xff0c;它们都具有高性能、高可靠性和高可扩展性等优点&#xff0c;但是它们之间也有一些区别和相似之处。了解它们之间的关系、区别、建议、适用场景和如何学习&#xff0c;对于提高技能和保持行业敏感性非常重要。本文将深入探…

电脑ip地址怎么改?修改技巧大放送!

在现代网络环境中&#xff0c;IP地址的设置对于连接互联网和局域网至关重要。无论是因为网络配置的需求&#xff0c;还是出于隐私和安全考虑&#xff0c;学会更改电脑的IP地址是一项有用的技能。本文将介绍电脑ip地址怎么改的3种方法&#xff0c;帮助您根据不同需求灵活调整网络…

Go并发GMP调度模型

如何知道一个对象是分配在栈上还是堆上&#xff1f; Go和C不同&#xff0c;Go的逃逸分析是在编译器完成的&#xff1b;go局部变量会进行逃逸分析。如果变量离开作用域后没有被引用&#xff0c;则优先分配到栈上&#xff0c;否则分配到堆上。那么如何判断是否发生了逃逸呢&#…

VMWare 16 安装

1、下载地址 VMware-workstation-full-16.2.4-20089737 2、激活码 VM16&#xff1a;ZF3R0-FHED2-M80TY-8QYGC-NPKYF 3、安装步骤 修改一下【安装位置】&#xff0c;将【增强型键盘驱动程序(需要重新引导以使用此功能()此功能要求主机驱动器上具有 10MB 空间。】【将 wMware…

【LLM】-07-提示工程-聊天机器人

目录 1、给定身份 1.1、基础代码 1.2、聊天机器人 2、构建上下文 3、订餐机器人 3.1、窗口可视化 3.2、构建机器人 3.3、创建JSON摘要 利用会话形式&#xff0c;与具有个性化特性&#xff08;或专门为特定任务或行为设计&#xff09;的聊天机器人进行深度对话。 在 Ch…

钉钉 ai卡片 stream模式联调

sdk连接 新建卡片模板下载node.js sdkconfig.json 配置应用信息 启动项目npm i npm run build npm run start连接成功 获取卡片回调 注册卡片回调事件调用https://api.dingtalk.com/v1.0/card/instances 创建卡片实例&#xff0c;返回实例Id //参数结构 {"cardTempla…

同花顺股票数据逆向:Cookie加密和Hook注入

&#x1f50d; 思路与步骤详解 &#x1f310; 抓包解析接口 首先&#xff0c;我们使用抓包工具对同花顺的股票数据接口进行分析&#xff0c;发现其中的Cookie参数经过了加密处理。 接下来&#xff0c;我们需要深入挖掘这些加密参数的生成位置。 &#x1f6e0; hook注入 对于…

信号的运算

信号实现运算&#xff0c;首先要明确&#xff0c;电路此时为负反馈电路&#xff0c;当处于深度负反馈时&#xff0c;可直接使用虚短虚断。负反馈相关内容可见&#xff1a;放大电路中的反馈_基极反馈-CSDN博客https://blog.csdn.net/qq_63796876/article/details/140438759 一、…

【深度学习总结】基于U-Mamba使用nnUNetv2处理BraTS挑战赛数据

基于U-Mamba使用nnUNetv2处理BraTS挑战赛数据 【深度学习总结】基于U-Mamba使用nnUNetv2处理BraTS挑战赛数据U-Mamba介绍数据集下载环境准备数据集准备运行其他2D网络结构UMambaBot的模型结构UMambaEnc的模型结构 【深度学习总结】基于U-Mamba使用nnUNetv2处理BraTS挑战赛数据 …

matlab仿真 数字基带传输(下)

&#xff08;内容源自详解MATLAB&#xff0f;SIMULINK 通信系统建模与仿真 刘学勇编著第六章内容&#xff0c;有兴趣的读者请阅读原书&#xff09; clear all Fd1;%符号采样频率 Fs10;%滤波器采样频率 r0.2;%滤波器滚降系数 delay4;%滤波器时延 [num,den]rcosine(Fd,Fs,defau…

使用LLaMA-Factory对Llama3-8B-Chinese-Chat进行微调

文章目录 模型及数据&#xff1a;模型下载数据 LLaMA-Factory启动拉取代码启动webui 模型训练数据导入数据预览设置模型路径配置参数及参数的保存开始训练 过程观察加载模型、对话模型导出、再次加载 模型及数据&#xff1a; 模型下载 使用基于中文数据训练过的 LLaMA3 8B 模…

Java基本数据类型与String类型的转换

目录 基本数据类型和Strng类型的转换 第一种方法 第二种方法 将字符串转成字符 注意事项 本章练习题 题1 题2 基本数据类型和Strng类型的转换 第一种方法 使用号和" "即可完成转换 第二种方法 第二种方法是通过基本类型的包装类调用parsexx方法 将字符…

计算机视觉与图像分类:技术原理、应用与发展前景

引言 随着科技的不断进步&#xff0c;计算机视觉逐渐成为了人工智能领域的重要分支之一。计算机视觉旨在让计算机具备“看懂”图像和视频的能力&#xff0c;从而理解和分析视觉信息。作为计算机视觉中的一个关键任务&#xff0c;图像分类涉及将输入的图像归类到预定义的类别中&…