一文讲清楚shell 中的变量是怎么回事

news2024/9/19 17:32:48

目录

变量和引用

一, 什么是变量

二, 根据数据类型分类

三, 根据作用域分类

 1、环境变量

 2、普通变量

四, 变量的定义

 1、变量定义示例:变量名=变量值

  2、位置参数和预定义变量

五, shell中的引用

六,变量的运算


变量和引用

一, 什么是变量

       顾名思义,变量就是程序设计语言中的一个可以变化的量,当然,可以变化的是变量的值。几乎所 有的程序设计语言中都有定义变量,并且其涵义也大同小异。从本质上讲,变量就是在程序中保存用户 数据的一块内存空间,而变量名就是这块内存空间的地址

       在程序的执行过程中,保存数据的内存空间的内容可能会不断地发生变化,但是,代表内存地址的 变量名却保持不变。

环境变量全部用大写字母表示

变量:变量名=值(可不可以是一个表达式, 命令执行的结果)

        

二, 根据数据类型分类

         Shell是一种动态类型语言和弱类型语言,即在Shell中,变量的数据类型毋需显示地声明,变量的数据类型会根据不同的操作有所变化。准确地讲,Shell中的变量是不分数据类型的,统一地按照字符串存储。但是根据变量的上下文环境,允许程序执行一些不同的操作,例如字符串的比较和整数的加减等等。

var_data=1              遇到有空格连接的字符串,空格以及空格后面的无法输出

var_data2='1'         单引号里面的内容原样输出

var_data3="1"        可以把空格打印出来,双引号整体输出

var_data4=`pwd`   反引号表示执行这条命令,获取这条命令的执行结果

Var_data5=$(pwd)

什么是弱类型语言、强类型语言?

       强类型和弱类型主要是站在变量类型处理的角度进行分类的。强类型是指不允许隐式变量类型转换,弱类型则允许隐式类型转换。

       强类型语言,当你定义一个变量是某个类型,如果不经过代码显式转换(强制转化)过,它就永远都是这个类型,如果把它当做其他类型来用,就会报错

       弱类型语言,你想把这个变量当做什么类型来用,就当做什么类型来用,语言的解析器会自动(隐 式)转换。

比如:

C语言定义变量,int+变量名,实则前面的int就是给变量内存划分了等级,int定义整型所以空间里 只能存放整型,这就是强类型。php、C#和Python等都是强类型语言。

可以使用declare定义变量的类型:declare attribute variable

注:declare命令还可输出所有的变量、函数、整数和已经导出的变量

-p:显示所有变量的值

-i:将变量定义为整数,在之后就可以直接对表达式求值,结果只能是整数。如果求值

     失败或者不是整 数,就设置为0。

 -r:将变量声明为只读变量。只读变量不允许修改,也不允许删除。(也可使用readonly

      定义只读变量)

-a:变量声明为数组变量。但这没有必要,所有变量都不必显示定义就可以用作数组。

      事实上,在某 种意义上,似乎所有变量都是数组,而且赋值给没有下标的变量与

      赋值给下标为0的数组元素相同。

 -f:显示所有自定义函数,包括名称和函数体。

 -x:将变量设置成环境变量。可使用+x将变量变成非环境变量

(环境变量必须使用declare -x   或者  export导出才称为环境变量 )

三,根据作用域分类

根据作用域可将变量分为环境变量(全局变量)和普通变量(局部变量)

 1、环境变量

      环境变量也可称为全局变量,可以在创建它们的shell及其派生出来的任意子进程shell中使用(su - 切换用户会读取新的环境变量),环境变量又可分为自定义环境变量和bash内置的环境变量。

命令行定义一个环境变量并用export命令导出,切换用户访问不到,新建连接也访问不到

(1)自定义环境变量

       一般是指用export内置命令导出的变量,用于定义shell的运行环境,保证shell命令的正确执行。环境变量可以在命令行中设置和创建,但用户退出命令行时这些变量值就会丢失,即该环境变量只在当前 shell和子shell中有效。如果希望永久保存环境变量,可以在配置文件中设置。

①用户的环境变量配置(non-login shell)

~/.bash_profile或~/.bashrc

②全局环境变量的配置(login shell)

 /etc/bashrc、/etc/profile文件或者/etc/profile.d目录(额外配置文件)中定义。

文件之间的联系:

在/etc/profile有一条:    .   /etc/bashrc -》 要去执行/etc/bashrc

                                    (以".  " 的方式执行不会产生子进程)

                                               /etc/profile.d/*.sh  . "$i" -> 也要去执行/etc/profile.d/*.sh的文件

在/etc/bashrc -> 会执行/etc/profile.d/*.sh文件

在~/.bash_profile中:      . ~/.bashrc

在~/.bashrc中:           . /etc/bashrc

1.如果我要配置一个只针对root用户的环境变量,应该配置在什么地方

~/.bash_profile或者~/.bashrc

2.如果我要配资一个针对所有用户的环境变量,应该配置在什么地方

/etc/profile或者/etc/bashrc 或者在/etc/profile.d目录中去定义.sh文件

定义环境变量的方式:

1. export mydata2=mydata2

2. mydata=mydata;export mydata

3. declare -x mydata3=mydata3

小练习:

1,进入到当前用户家目录下的配置文件中配置环境变量

[root@wangjingjing 0130]# vim ~/.bash_profile

mydata1=mydata1

export mydata1

export mydata2=mydata2

declare -x mydata3=mydata3

2,直接访问会出现访问不到,因为登录时,配置文件已经加载过

[root@wangjingjing 0130]# echo $mydata1

[root@wangjingjing 0130]# echo $mydata2

[root@wangjingjing 0130]# echo $mydata3

3,建立新的连接会重新加载配置文件可以直接访问到

[root@wangjingjing 0130]# echo $mydata1

mydata1

[root@wangjingjing 0130]# echo $mydata2

mydata2

[root@wangjingjing 0130]# echo $mydata3

mydata3

[root@wangjingjing 0130]#

4,Su -  会切换环境变量可以直接访问到

[root@wangjingjing 0130]# su -

[root@wangjingjing ~]# echo $mydata1

mydata1

[root@wangjingjing ~]# echo $mydata2

mydata2

[root@wangjingjing ~]# echo $mydata3

mydata3

5,在当前环境去访问(不产生子进程),source和.

[root@wangjingjing ~]# source ~/.bash_profile

[root@wangjingjing ~]# echo $mydata3

mydata3

[root@wangjingjing ~]# echo $mydata2

mydata2

[root@wangjingjing ~]# echo $mydata1

mydata1

[root@wangjingjing ~]#

 注意:按照系统规范,所有环境变量的名字均采用大写形式。在将环境变量应用于用户进程程序之前,都应该用 命令export导出。

 有一些环境变量,比如HOME,PATH,SHELL,UID,USER等,在用户登录前就已经被/bin/login程序设置 好了,通常环境变量被定义并保存在用户家目录下的.bash_profile文件或全局的配置文件/etc/profile 中。

(2)bash内置的环境变量

        shell内置的环境变量是所有的shell程序都可以使用的变量。shell程序在运行时,都会接收一组变量 来确定登录用户名、命令路径、终端类型、登录目录等,这组变量就是环境变量。环境变量会影响到所 有的脚本的执行结果。

注:可使用env查看环境变量

1,HOME 用户主目录的路径名,是cd命令的默认参数

[root@wangjingjing ~]# echo $HOME

/root

[root@wangjingjing ~]# su redhat

[redhat@wangjingjing root]$ echo $HOME

/home/redhat

[redhat@wangjingjing root]$ exit

exit

[root@wangjingjing ~]#

2,IFS 定义shell使用的分隔符(默认是空行)

[root@wangjingjing ~]# echo $IFS

[root@wangjingjing ~]#

[root@wangjingjing ~]# echo "$IFS 123"

         

 123

[root@wangjingjing ~]#

3,LOGNAME 当前的登录名

[root@wangjingjing ~]# echo $LOGNAME

root

[root@wangjingjing ~]# su redhat

[redhat@wangjingjing root]$ echo $LOGNAME

redhat

2、普通变量

        普通变量也可称为局部变量,与全局变量相比,局部变量的使用范围较小,通常仅限于某个程序段访 问,例如函数内部。在Shell语言中,可以在函数内部通过local关键字定义局部变量,另外,函数的参数 也是局部变量。

四, 变量的定义

        在Shell中,通常情况下用户可以直接使用变量,而毋需先进行定义,当用户第一次使用某个变量名 时,实际上就同时定义了这个变量,在变量的作用域内,用户都可以使用该变量。

 1、变量定义示例:变量名=变量值

#!/bin/bash #定义变量a

a=1

 #定义变量b

b="hello"

#定义变量c

c="hello world"

#定义备份路径

bak_dir=/data/backup

#把一个命令的结果赋值变量

变量名=`ls`

变量名=$(ls)

注意:

(1)“=”前后不能有空格

(2)字符串类型建议用引号括起来,尤其是特殊字符或有空格

 引用变量:$变量名 或者${变量名}

[root@wangjingjing ~]# data=1

[root@wangjingjing ~]# echo $data

1

[root@wangjingjing ~]# echo ${data}

1

[root@wangjingjing ~]#

 查看变量:echo $变量名,set(可查看所有变量:包括自定义变量和环境变量),env

                  显示全局变量, declare输出所有的变量、函数、整数和已经导出的变量。

[root@wangjingjing ~]# set | grep mydata

mydata1=mydata1

mydata2=mydata2

mydata3=mydata3

[root@wangjingjing ~]# env | grep mydata

mydata2=mydata2

mydata3=mydata3

mydata1=mydata1

[root@wangjingjing ~]# declare | grep mydata

mydata1=mydata1

mydata2=mydata2

mydata3=mydata3

[root@wangjingjing ~]#

 取消变量:unset 变量名

[root@wangjingjing ~]# data=1

[root@wangjingjing ~]# echo $data

1

[root@wangjingjing ~]# unset data

[root@wangjingjing ~]# echo $data

[root@wangjingjing ~]#

 作用范围:仅在当前shell中有效

注:可使用export指令将变量转换成环境变量

2、位置参数和预定义变量

许多情况下,Shell脚本都需要接收用户的输入,根据用户输入的参数来执行不同的操作。 从命令行传递给Shell脚本的参数又称为位置参数,Shell脚本会根据参数的位置使用不同的位置参数变量 读取它们的值。

练习:

建立一个脚本:args_script.sh

bash args_script.sh 传递6个参数

1.获取参数的个数

2.获取所有的参数

3.获取1,3,5这个三个位置的参数

4.获取脚本的名字

1,打开文件编辑并保存退出

[root@wangjingjing ~]# vim args_script.sh

echo "args count is $#"

echo "all args(@) are $@"

echo "all args(*) are $*"

echo "arg 1 is $1"

echo "arg 3 is $3"

echo "arg 5 is $5"

echo "script name is $0"

 

2,执行文件,传入参数

[root@wangjingjing ~]# bash args_script.sh 1 2 3 4 5 6

args count is 6

all args(@) are 1 2 3 4 5 6

all args(*) are 1 2 3 4 5 6

arg 1 is 1

arg 3 is 3

arg 5 is 5

script name is args_script.sh

 

$*和$@的区别示例:   整体    单独个体

[root@wangjingjing ~]# set -- 1 2 3 4

[root@wangjingjing ~]# for i in "$@";do echo $i;done;

1

2

3

4

[root@wangjingjing ~]# for i in "$*";do echo $i;done;

1 2 3 4

[root@wangjingjing ~]#

五, shell中的引用

 在bash中有很多特殊字符,这些特殊字符就具有特殊含义。引用就是通知shell将这些特殊字符当作普通 字符来处理。

六,变量的运算

与其他的程序设计语言一样,shell也有很多运算符。

加法:

[root@wangjingjing ~]# data=$((1+2))

[root@wangjingjing ~]# echo $data

3

减法:

[root@wangjingjing ~]# data=$((1-2))

[root@wangjingjing ~]# echo $data

-1

乘法:

[root@wangjingjing ~]# data=$((1*2))

[root@wangjingjing ~]# echo $data

2

除法:

[root@wangjingjing ~]# data=$((1/2))

[root@wangjingjing ~]# echo $data

0

幂次方:

[root@wangjingjing ~]# data=$((2**2))

[root@wangjingjing ~]# echo $data

4

加等;其它等与之类似:

[root@wangjingjing ~]# data=1

[root@wangjingjing ~]# ((data+=1))

[root@wangjingjing ~]# echo $data

2

自增(++data)   自减与之相同:

[root@wangjingjing ~]# data=1

[root@wangjingjing ~]# ((data2=++data))              data加一后赋值给data2

[root@wangjingjing ~]# echo $data

2

[root@wangjingjing ~]# echo $data2

2

自增(data++):

[root@wangjingjing ~]# data=1

[root@wangjingjing ~]# ((data2=data++))       把data赋值给data2后,data加一

[root@wangjingjing ~]# echo $data

2

[root@wangjingjing ~]# echo $data2

1

二进制

位运算(左移变大,右移变小)

左移:

[root@wangjingjing ~]# echo $((8<<2))

32

右移:

[root@wangjingjing ~]# echo $((8>>2))

2

&

[root@wangjingjing ~]# echo $((8&8))

8

|

[root@wangjingjing ~]# echo $((8|8))

8

 

异或^(相同为0,不同为1)

[root@wangjingjing ~]# echo $((8^8))

0

[root@wangjingjing ~]# echo $((1^2))

3

用作整数运算:(() -> (())中变量不需要使用$

                                    echo  $(())

                                let:  let 变量名=运算表达式

                              echo $变量名

                                expr:  expr  1 + 1

                                           expr  1 '+' 1

                                $[]:  使用: echo $[1+1]

                                declare:  declare -i data=2+3

                                                  echo $data

用作小数的运算   echo  " 计算"  |  bc

1,() -> (())中变量不需要使用$

                                    echo  $(())

[root@wangjingjing ~]# echo $((1+1))

2

   2,   let:  let 变量名=运算表达式

                              echo $变量名

[root@wangjingjing ~]# let data+1+1

[root@wangjingjing ~]# echo $data

2

3, expr:  expr  1 + 1

               expr  1 '+' 1

               expr $num + $ num2

expr也可以检查两个值是否为数字,非数字无法运算,会报错

[root@wangjingjing ~]# expr 1 + 1

2

[root@wangjingjing ~]# expr 1 "+" 1

2

[root@wangjingjing ~]# num1=1

[root@wangjingjing ~]# num2=a

[root@wangjingjing ~]# expr $num1 + 1 &> /dev/null

[root@wangjingjing ~]# echo $?

0

[root@wangjingjing ~]# expr $num2 + 1 &> /dev/null

[root@wangjingjing ~]# echo $?

2

4bc 

echo  " 表达式"  |  bc

[root@wangjingjing ~]# echo "1+1" | bc

2

直接执行bc命令是交互式的

5,  $[]:  使用: echo $[1+1]

[root@wangjingjing ~]# echo $[1+4]

5

6,declare -I 变量=运算表达式

   echo $变量

[root@wangjingjing ~]# declare -i data=8+9

[root@wangjingjing ~]# echo $data

17

练习:

定义两个变量:num1=10和num2=2
使用(()): 计算num1 + num2的值并输出
使用let: 计算num1 * num2的值输出
使用expr: 计算num1 对 num2执行或的位运算
使用$[]: 计算 num2的num1次方值
declare: 计算 num1 除以 num2的值


定义两个变量:num1=10和num2=2

[root@wangjingjing ~]# num1=10

[root@wangjingjing ~]# num2=2

1,使用(()): 计算num1 + num2的值并输出

[root@wangjingjing ~]# echo $((num1+num2))

2,使用let: 计算num1 * num2的值输出

[root@wangjingjing ~]# let data=num1*num2

[root@wangjingjing ~]# echo $data

3,使用expr: 计算num1 对 num2执行或的位运算

[root@wangjingjing ~]# expr $num1 "|" $num2

4,使用$[]: 计算 num2的num1次方值

[root@wangjingjing ~]# echo $[num2**num1]

5,declare: 计算 num1 除以 num2的值

[root@wangjingjing ~]# declare -i data=num1/num2

[root@wangjingjing ~]# echo $data

1,返回变量的内容

2,求字符串的长度

[root@wangjingjing ~]# echo ${#date}

3,截取字符串,截取3(输出不包括3)之后的字符串

[root@wangjingjing ~]# echo ${date:3}

4,从那个位置开始截取,以及截取的字符串的长度为多长

[root@wangjingjing ~]# echo ${date:2:2}

5,从最左边到最右边匹配到并删除最短的字符串

[root@wangjingjing ~]# echo ${data#*/}

6,从最左边到最右边匹配到并删除最长的字符串(最短作比较)

7,从最右到最左边匹配到并删除最短的字符串(最长作比较)

[root@wangjingjing ~]# echo ${data%/*}

8,从最右边到最右边匹配到并删除最长的字符串(最短作比较)

9,替换只替换第一个

10,替换所有,对原来的变量并没有改变

练习:

path=/data/data1/data2.txt

[root@wangjingjing ~]# path=/data/data1/data2.txt

    去获取它所在的目录

[root@wangjingjing ~]# echo ${path%/*}

    去获取文件的名字

[root@wangjingjing ~]# echo ${path##*/}

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

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

相关文章

【GPLT 二阶题目集】L2-022 重排链表

输入格式&#xff1a; 每个输入包含1个测试用例。每个测试用例第1行给出第1个结点的地址和结点总个数&#xff0c;即正整数N (≤10^5 )。结点的地址是5位非负整数&#xff0c;NULL地址用−1表示。 接下来有N行&#xff0c;每行格式为&#xff1a; Address Data Next 其中Addres…

深拷贝和浅拷贝对比

JavaScript存储引用数据&#xff08;对象&#xff09;都是存地址的&#xff0c;存放在堆内存中的对象&#xff0c;在栈内存中存的是一个指针&#xff0c;这个指针指向堆内存一个位置。再从堆内存中取得所需的数据。 深拷贝&#xff1a;对数据进行拷贝之后&#xff0c;修改拷贝之…

Python:从协议到抽象基类

本章话题是接口&#xff1a;鸭子类型代表特征动态协议&#xff1b; 使接口更明确、能验证实现是否副了规定的抽象基类ABC(Abstact Base Class).Python语言诞生15年后&#xff0c;Python2.6中才引入了抽象基类&#xff0c;抽象基类。对于java、C#类似的语言&#xff0c;会觉得鸭…

DevSecOps敏捷安全技术金字塔V3.0正式发布

2022年12月28日&#xff0c;由悬镜安全主办&#xff0c;3S-Lab软件供应链安全实验室、Linux基金会OpenChain社区、ISC、OpenSCA社区联合协办的第二届全球DevSecOps敏捷安全大会&#xff08;DSO 2022&#xff09;已通过全球直播的形式圆满举行。本届大会以“共生敏捷进化”为主题…

HTB_Markup_xml注入读ssh私钥进程注入

文章目录信息收集xml注入ssh 私钥连接提权信息收集 使用如下参数可以探测具体版本&#xff0c;只使用-sV -v无此效果 nmap -sC -A -Pn 10.129.95.192是个登录页面 弱口令&#xff0c;只有admin-password成功登录 几个页面&#xff0c;只有order.php页面可以与后端交互并传递x…

【Kubernetes 企业项目实战】06、基于 Jenkins+K8s 构建 DevOps 自动化运维管理平台(中)

目录 一、基于 Jenkinsk8sGitDocker Hub 等技术链构建企业级 DevOps 容器云平台 1.1 安装 Jenkins 1.1.1 安装 nfs 服务 1.1.2 在 kubernetes 中部署 jenkins 1.2 配置 Jenkins ​1.2.1 获取管理员密码 1.2.2 安装插件 1.2.3 创建第一个管理员用户 1.3 测试 jenkins 的…

VMware Workstation中安装Kali 2022

VMware Workstation中安装Kali 2022 前言 开工了&#xff0c;笔记本中的相关工具该更新了&#xff0c;今天记录一下。 首先记录的是在VMware Workstation中安装kali&#xff0c;这个过程比较简单。 我只是想扩充一下自己的博客&#xff0c;另外可以给入门人员一个参考。 下载…

react的JSX语法

1.jsx基本使用 1 createElement() 的问题 繁琐不简洁。不直观&#xff0c;无法一眼看出所描述的结构。不优雅&#xff0c;用户体验不爽。 2 JSX 简介 JSX 是 JavaScript XML 的简写&#xff0c;表示在 JavaScript 代码中写 XML&#xff08;HTML&#xff09; 格式的代码。 优…

通信原理笔记—增量调制(∆M)

目录 概述&#xff1a; 简单增量调制(∆M)原理&#xff1a; 编码器与解码器 简单△M的过载问题&#xff1a; 增量总和(∆-Σ)调制 数字压扩自适应增量调制&#xff1a; 不同编码调制方式的误码性能分析&#xff1a; 概述&#xff1a; 最简单的DPCM是增量调制&#xff0c…

layui框架学习(4:导航)

layui官网教程采用html中的无序列表和定义列表来实现导航样式&#xff08;文章最后还有个关于导航所用元素的补充说明&#xff09;&#xff0c;主要包括水平导航、垂直/侧边导航&#xff0c;同时还支持用span和a元素实现面包屑导航样式。导航功能需要加载element模块&#xff0…

实验二:Linux主机漏洞利⽤攻击实践

&#xff08;一&#xff09;实验简介 实验所属系列&#xff1a;windows主机漏洞利用攻击实践 实验对象&#xff1a;本科/专科信息安全专业 相关课程&#xff1a;渗透测试 实验时数&#xff08;学分&#xff09;&#xff1a;2学时 实验类别&#xff1a;实践类 &#xff08;二&a…

如何集中式管理多个客户端节点传输任务-镭速

在一些生产制造企业或it部门&#xff0c;它们的生产机器设备每天都会有大量的生产数据&#xff0c;并且需要人为地对这些数据进行迁移或者归档备份到其他存储。这样重复性的操作&#xff0c;无疑大大提高了人工成本&#xff0c;而且运作起来的效率也不高。 镭速服务器集中式任务…

MySQL优化方案

一、MySQL 的优化方案有哪些&#xff1f;MySQL 数据库常见的优化手段分为三个层面&#xff1a;SQL 和索引优化、数据库结构优化、系统硬件优化等&#xff0c;每个大的方向中又包含多个小的优化点。1.SQL 和索引优化通过优化 SQL 语句以及索引来提高 MySQL 数据库的运行效率① 使…

【UE5】动画系统

title: 【UE5】动画系统 date: 2023-01-31 19:50:47 tags: UE5 categories: 学习笔记 password: abstract: message: 最近接触的项目涉及到动捕和动画&#xff0c;以前接触的范围主要是GamePlay以及C和蓝图的交互&#xff0c;很少接触动画&#xff0c;借此机会学习一下UE5的动…

【Jmeter】报错解决:JedisException: Could not return the broken resource to the pool

一、报错详情 (1)报错场景 使用 Jmeter 插件 Redis Data Set 配置连接 Redis 数据池时,运行出现报错 (2)报错日志

Python对liunx中mysql数据库进行单表查询 10个案例带你了解

关于Python连接liunx中mysql数据库的方式在这一篇文章 这里写目录标题1.在Liunx服务器中的mysql新建一个表2.插入数据3.连接liunx中的mysql数据库1、查询1946班的成绩信息2&#xff0c;查询1944班&#xff0c;语文成绩大于60小于90的成绩信息3&#xff0c;查询学生表中1到6行的…

QTabWidget 美化 qss

1. tab&#xff0c; tab-bar&#xff0c; pane属性分布 2. 使用qss美化时&#xff0c;tab标签上和pane中都能美化成功&#xff0c;但tab最右侧的tab-bar却始终没有成功。 /*设置控件的背景*/ QTabWidget {background-color:rgb(4,138,224); } /*设置控件下面板的背景颜色*/ QT…

C++11 常用的新特性

本篇介绍C11标准对比之前C标准的新特性&#xff0c;C11为C语言在2011年发布的版本&#xff0c;它改进幅度很大&#xff0c;影响至今。如加入auto 关键字、nullptr、移动语义&#xff08;move semantics&#xff09;、委托构造函数&#xff08;delegating constructors&#xff…

ChatGPT超详细注册与使用教程

文章目录前言一、ChatGPT账号注册二、SMS-ACTIVATE虚拟手机号验证三、ChatGPT使用总结前言 最近ChatGPT非常火爆&#xff0c;是一种革命性的技术&#xff0c;这也吸引来了很多人想尝试一下&#xff0c;但是由于并没有在国内开通这项服务&#xff0c;所以国内的用户无法使用Chat…

Javascript预解析

1.我们js引擎运行js 分为两步&#xff0c;1.预解析&#xff0c;2.执行代码 &#xff08;1&#xff09;预解析&#xff1a;js引擎会把js里面所有的var还有function提升到当前作用域发的前面 &#xff08;2&#xff09;执行代码&#xff1a;按照代码书写的顺序从上往下执行 2.预…