鸿蒙里四种作用域你都理解了吗?

186 阅读4分钟

概念

首先我们都应该要知道鸿蒙的底层运行逻辑,而他的运行逻辑就是把ArkTs转化成js, 这样我们就可以理解为js的运行逻辑在鸿蒙上面一样通用,所以,我们进入正题。

作用域

  • 因为鸿蒙底层是js,所以同样可以分为四种作用域:
  • 作用域遵循的规则是:就近原则,由小到大
  • 在四种作用域都存在时:块级作用域>函数作用域>模块作用域>全局作用域这是一个属性要在块级作用域输出时的顺序,以此同理类推
  • if语句中会形成块级作用域
  • 函数会形成函数作用域
  • 模块会形成模块作用域
  • 全局会形成全局作用域

全局作用域

当你在"script"标签中直接编写的代码或者在任何函数外部定义的变量和函数都处于全局作用域。这是对js来说的,鸿蒙没有确切范围表示,但最大的是他,在其他作用域中找不到你要的属性或方法时,就会来到全局查找如果还是没有,可能会出现报错提示

特点:
  • 全局变量会被同名局部变量覆盖

模块作用域

在js中.js结尾的文件,在鸿蒙以.ets文件结尾的文件,都称为模块,而模块有着模块作用域,这个作用域可以写属性,方法,组件等,,此外通过export导出,import导入的属性,方法,都会在导入的位置开始获得导入当前到模块的模块作用域

特点:
  • 不同模块可以有同名命属性,方法
  • 方便封装和复用

函数作用域

函数作用域是在函数内部定义的变量和函数所拥有的作用域。当函数被调用时,会创建一个新的作用域,其中包含函数内部定义的变量和参数。

特点:
  • 函数作用域中的变量只能在函数内部被访问,外部无法直接访问。
  • 函数内部可以访问外部作用域(包括全局作用域)中的变量,但外部作用域不能直接访问函数内部的变量。

块级作用域

  • 使用let和const关键字声明的变量具有块级作用域。
特点:
  • 块级作用域中的变量只在其所在的代码块内有效,出了代码块就无法访问。
  • const声明的变量是常量,一旦被赋值就不能再被重新赋值。

代码演示

第一种:块级作用域:

1.png

  1. 第一通过就近原则确定了属性位置在块级作用域,所以是他
第二种:函数作用域:

2.png

  1. 第一通过就近原则向上查找块级作用域,发现并没有这个属性,继续向上查找发现函数作用域存在,所以就近确定是他了
第三种:模块作用域:

3.png

  1. 第一通过就近原则向上查找块级作用域,发现并没有这个属性,继续向上查找发现函数作用域也不存在,所以找到了模块作用域发现存在,所以确定是他了
第四种:全局作用域:

4.png

  1. 这种就是一直找到全局作用域也不存在时发生的错误提示

作用域链

  • 首先,我可以发现这种一个域一个域的往上查找就像形成了一条链,而这我们称呼为作用域链,直到全局也没有找到出现报错

闭包:



function outerFunction() {
  let outerVar = 'outer'
  let innerFunction = () => {
    console.log(outerVar)
  }
  return innerFunction
}

let nn = outerFunction();
nn()

这里补充一下闭包:闭包是一种特殊的函数,如一个函数内有另一个函数,内部函数称为闭包函数,包着他的称为外部函数,而在外部函数调用完了,如此外部函数的属性应该被销毁,但有闭包函数在所以仍可以调用外部函数的属性,因为闭包函数有了外部函数的属性,所以再调用外部函数时,即可调用闭包函数,这就是闭包