JavaScript作用域实战

● 首先,我们先创建一个函数,和以前一样,计算一个年龄的

function calcAge(birthYear) {
  const age = 2037 - birthYear;
  return age;
}

● 然后我们创建一个全局变量,并调用这个函数

const firstName = "IT知识一享";
calcAge(1998);

● 因为firstName是一个全局变量,所以在函数中,我们也可以调用这个变量

function calcAge(birthYear) {
  const age = 2037 - birthYear;
  console.log(firstName);
  return age;
}

在这里插入图片描述

注:这里函数首先会在自己的作用域中找这个变量,如果找不到,会向上从作用域链中寻找这个变量,直到找到为止,如果找不到的话就会报错!

● 现在我们在函数内再添加一个函数

function calcAge(birthYear) {
  const age = 2037 - birthYear;

  function printAge() {
    const output = `${age}岁了,出生于${birthYear}`;
    console.log(output);
  }
  printAge();
  return age;
}

在这里插入图片描述

注:printAge函数中调用了age变量,但是再函数作用域中并未找到,所以就通过作用域链再父范围去寻找,最终找到打印出来,但是age变量只能再calcAge整个函数内部使用,外部无法使用这个变量

function calcAge(birthYear) {
  const age = 2037 - birthYear;

  function printAge() {
    const output = `${age}岁了,出生于${birthYear}`;
    console.log(output);
  }
  printAge();
  return age;
}

const firstName = 'IT知识一享';
calcAge(1998);
console.log(age);

在这里插入图片描述

记住,翻译链是单项的,只能内部访问外部,外部无法访问到内部!
● 当然,在函数中,我们也可以把firstName加上,因为他是全局变量

 function printAge() {
    const output = `${firstName},你${age}岁了,出生于${birthYear}`;
    console.log(output);
  }
  printAge();
  return age;
}

在这里插入图片描述

● 现在,我们在printAge中添加if判断

 function printAge() {
    const output = `${firstName},你${age}岁了,出生于${birthYear}`;
    console.log(output);
  }

  if(birthYear >= 1981 && birthYear <= 1996) {
    const str = `哇哦,你是千禧一代的人,${firstName}`;
    console.log(str);
  }

  printAge();
  return age;
}

在这里插入图片描述

因为firstName是全局变量,所以if条件仍然可以通过作用域链找到这个变量。

● 但是str的变量在if之外的区域则无法被访问

function printAge() {
    const output = `${firstName},你${age}岁了,出生于${birthYear}`;
    console.log(output);
  }

  if (birthYear >= 1981 && birthYear <= 1996) {
    const str = `哇哦,你是千禧一代的人,${firstName}`;
    console.log(str);
  }
  console.log(str);

  printAge();
  return age;
}

在这里插入图片描述

因为let和const是块作用域,所以上述才能生效
● 现在我们使用var创建一个变量

 if (birthYear >= 1981 && birthYear <= 1996) {
    var millenial = true;
    const str = `哇哦,你是千禧一代的人,${firstName}`;
    console.log(str);
  }
  console.log(millenial);

在这里插入图片描述

因为var并不是块级作用域,而是函数作用域,它知识在函数中调用可以,但是全局中或者脱离上一级函数情况下仍然不可以,这是还是要符合作用域链的;
● 当然,现在我们在if中创建一个功能函数,仍然是块级区域,无法在外部访问

 if (birthYear >= 1981 && birthYear <= 1996) {
    var millenial = true;
    const str = `哇哦,你是千禧一代的人,${firstName}`;
    console.log(str);

    function add(a, b) {
      return a + b;
    }
  }
  console.log(millenial);
  console.log(add(2, 3));

在这里插入图片描述

注:这仅仅是在严格模式下
在这里插入图片描述

● 但是如果我们把严格模式去除的话,则会被正常调用
在这里插入图片描述

但是我们使用会用严格模式去编写我们的代码,这样会让代码出现奇奇怪怪的的情况变得很少!
● 如果我们在if条件中去声明姓名变量的话,会发生什么情况呢?

 if (birthYear >= 1981 && birthYear <= 1996) {
    var millenial = true;
    const firstName = "mark";
    const str = `哇哦,你是千禧一代的人,${firstName}`;
    console.log(str);

    function add(a, b) {
      return a + b;
    }
  }

在这里插入图片描述

这更加验证了,它会首先在在自己所在的作用域去寻找,如果找到的话,它不会通过作用域链去向父范围查找;除此之外,我们不应该把内部的firstName和外部的看作是一个变量,从本质来讲,它们就是两个变量,只是恰巧名字一样罢了。
● 那如果我们在内部讲外部的函数重新赋值,那又是什么情况呢?

function calcAge(birthYear) {
  const age = 2037 - birthYear;

  function printAge() {
    let output = `${firstName},你${age}岁了,出生于${birthYear}`;
    console.log(output);

    if (birthYear >= 1981 && birthYear <= 1996) {
      var millenial = true;
      const firstName = 'mark';
      const str = `哇哦,你是千禧一代的人,${firstName}`;
      console.log(str);

      function add(a, b) {
        return a + b;
      }

      output = 'NEW OUTPUT';
    }
    console.log(millenial);
    //   console.log(add(2, 3));
    console.log(output);
  }
  printAge();
  return a

在这里插入图片描述

● 但是如下

const output = 'NEW OUTPUT';

在这里插入图片描述

重新赋值变量和创建变量是不同的!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【pytorch源码分析--torch执行流程与编译原理】

背景 解读torch源码方便算子开发方便后续做torch 模型性能开发 基本介绍 代码库 https://github.com/pytorch/pytorch 模块介绍 aten: A Tensor Library的缩写。与Tensor相关的内容都放在这个目录下。如Tensor的定义、存储、Tensor间的操作&#xff08;即算子/OP&#xff…

深度学习_8_对Softmax回归的理解

回归问题&#xff0c;例如之前做房子价格预测的线性回归问题 而softmax回归是一个分类问题,即给定一个图片&#xff0c;从猫狗两种动物类别中选出最可靠的那种答案&#xff0c;这个是两类分类问题&#xff0c;因为狗和猫是两类 上述多个输出可以这样理解&#xff0c;假设一个图…

从NetSuite Payment Link杂谈财务自动化、数字化转型

最近在进行信息化的理论学习&#xff0c;让我有机会跳开软件功能&#xff0c;用更加宏大的视野&#xff0c;来审视我们在哪里&#xff0c;我们要到哪去。 在过去20多年&#xff0c;我们的财务软件经历了电算化、网络化、目前处于自动化、智能化阶段。从NetSuite这几年的功能发…

python 去除图像中的框

最近在做图像标注&#xff0c;会出现以下的图片&#xff0c;需要去除其中的边框。 1.思路 人工标注画框的范围P&#xff0c;并使用标注工具在画框上画一个点A。获取点A的坐标和颜色。在范围P内&#xff0c;将与点A颜色相似的每一个点x的颜色&#xff0c;替换为点x上下&#…

49基于matlab的Non dominated sorting genetic algorithm -II(NSGA-Ⅱ)多目标遗传算法

基于matlab的Non dominated sorting genetic algorithm -II&#xff08;NSGA-Ⅱ&#xff09;多目标遗传算法&#xff0c;其优势是降低了非劣排序遗传算法的复杂性&#xff0c;具有运行速度快&#xff0c;解集的收敛性好的优点&#xff0c;成为其他多目标优化算法性能的基准。程…

中国联通携手华为助力长城精工启动商用5G-A柔性产线

[中国&#xff0c;河北&#xff0c;2023年11月3日] 近日&#xff0c;中国联通携手华为助力精诚工科汽车系统有限公司保定自动化技术分公司&#xff08;简称长城精工自动化&#xff09;启动5G-A超高可靠性超低时延柔性产线的商用阶段。 在河北保定长城汽车制造产线&#xff0c;…

Visual Studio Code 常用快捷键大全

Visual Studio Code 常用快捷键大全 快捷键是编码过程中经常使用&#xff0c;且能够极大提升效率的部分&#xff0c;这里给大家介绍一些VS Code中非常有用的快捷键。 打开和关闭侧边栏 Mac — Command B Windows — Ctrl B Ubuntu — Ctrl B 选择单词 Mac — Command D …

安防监控系统EasyCVR视频汇聚平台,如何实现视频汇聚?

关注我们的朋友都知道&#xff0c;EasyCVR平台最初就是以汇聚为核心而进行打造的&#xff0c;那到底什么是汇聚平台呢&#xff1f;又如何进行视频资源汇聚&#xff1f;简单来说&#xff0c;视频汇聚平台是指能够从不同的视频源&#xff08;例如直播、点播等&#xff09;收集、整…

重磅发布|美创科技新一代 数据安全管理平台(DSM Cloud)全新升级

重磅发布 新一代 数据安全管理平台&#xff08;DSM Cloud&#xff09; 美创科技新一代 数据安全管理平台&#xff08;简称&#xff1a;DSM Cloud&#xff09;全新升级&#xff0c;正式发布。 在业务上云飞速发展过程中&#xff0c;快速应对数据激增&#xff0c;同时有效保障数…

R语言piecewiseSEM结构方程模型在生态环境领域实践技术应用

结构方程模型&#xff08;Sructural Equation Modeling&#xff0c;SEM&#xff09;可分析系统内变量间的相互关系&#xff0c;并通过图形化方式清晰展示系统中多变量因果关系网&#xff0c;具有强大的数据分析功能和广泛的适用性&#xff0c;是近年来生态、进化、环境、地学、…

【Python爬虫】selenium4新版本使用指南

Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。支持的浏览器包括IE&#xff08;7, 8, 9, 10, 11&#xff09;&#xff0c;Mozilla Firefox&#xff0c;Safari&#xff0c;Google Chrome&#xff0c;Opera&am…

贰[2],OpenCV函数解析

1&#xff0c;imread&#xff1a;图片读取 CV_EXPORTS_W Mat imread( const String& filename, int flags IMREAD_COLOR );//参数1(filename)&#xff1a;文件地址 //参数2(flags):读取标志 注:ImreadModes&#xff0c;参数2(flags)枚举定义 enum ImreadModes { IMREAD…

第四章 Web服务器(1)

1.www简介 Web网络服务也叫WWW(World Wide Web 全球信息广播)万维网服务&#xff0c;一般是指能够让用户通过浏览器访问到互联网中文档等资源的服务 Web 网络服务是一种被动访问的服务程序&#xff0c;即只有接收到互联网中其他主机发出的请求后才会响应&#xff0c;最…

FreeRTOS源码阅读笔记1--task.c

在FreeRTOS中&#xff0c;创建任务有两种方式&#xff1a;动态创建和静态创建。区别就是&#xff1a;动态创建任务的栈和任务TCB是由操作系统动态分配&#xff08;malloc&#xff09;内存空间&#xff0c;任务删除时可以释放内存&#xff08;free&#xff09;&#xff1b;而静态…

无需专线、无需固定公网IP,各地安防数据如何高效上云?

某专注于安防领域的企业&#xff0c;供机场、金融、智慧大厦等行业&#xff0c;包括门禁系统、巡更系统、视频监控在内的整体解决方案。 在实际方案交付过程中&#xff0c;往往需要在多地分支机构分别部署相应的安防设备&#xff0c;并将产生的数据实时统一汇总至云平台进行管理…

【ICN综述】信息中心网络隐私安全

ICN基本原理&#xff1a; 信息中心网络也是需要实现在不可信环境下可靠的信息交换和身份认证 信息中心网络采用以数据内容为中心的传输方式代替现有IP 网络中以主机为中心的通信方式&#xff0c;淡化信息数据物理或逻辑位置的重要性&#xff0c;以内容标识为代表实现数据的查找…

Centos 7.x上利用certbot申请Let‘s Encrypt的SSH证书(HTTPS证书)

目录 01-安装Certbot02-在网站的根目录依次新建文件夹.well-known和acme-challenge03-申请证书 要在CentOS 7.x上为域名申请Let’s Encrypt证书&#xff0c;你可以使用Certbot工具&#xff0c;它是一个自动化证书颁发工具&#xff0c;用于管理Let’s Encrypt证书。以下是在Cent…

有限域的Fast Multiplication和Modular Reduction算法实现

1. 引言 关于有限域的基础知识&#xff0c;可参考&#xff1a; RISC Zero团队2022年11月视频 Intro to Finite Fields: RISC Zero Study Club 有限域几乎是密码学中所有数学的基础。 ZKP证明系统中的所有运算都是基于有限域的&#xff1a; 使用布尔运算的数字电路&#xf…

分布式系统之BASE理论

BASE理论是对分布式系统设计和处理的一种理论指导&#xff0c;相对于ACID&#xff08;原子性、一致性、隔离性和持久性&#xff09;这一强一致性模型&#xff0c;BASE更强调在分布式系统中牺牲强一致性以获得可用性和性能的平衡。 BASE理论的核心概念包括&#xff1a; Basica…

ucharts 图表

<template><view><cu-custom bgColor"bg-gradual-blue" :isBack"true"><block slot"content">出库统计图</block></cu-custom><view><uni-segmented-control :current"current" :values…