美文网首页
Solidity - 变量作用域

Solidity - 变量作用域

作者: Llewyn_Davis | 来源:发表于2018-10-25 14:41 被阅读0次

2018-10-25笔记


代码块

代码块指的就是{}所围成的代码,也就是从{开始,到}结束,花括号里面的所有的代码,就属于一个代码块,变量的作用域伴随着代码块的结束而结束。

变量作用域

变量作用域也就是变量的可见范围,生存期,通俗讲就是可以使用该变量的范围。代码块内的变量作用域从声明开始,到花括号结束。
一条重要的规则,外层代码块的变量,对内层代码块可见,但是内层代码块的变量就对外层不可见。举个例子,你知道你老板是谁(因为你要拿工资),你老板不需要知道你是谁。

例外情况

Variables and other items declared outside of a code block, for example functions, contracts, user-defined types, etc., are visible even before they were declared. This means you can use state variables before they are declared and call functions recursively.

这个意思就是,状态变量、函数声明、struct定义等(这些虽然也定义在contract的代码块外,但是他们无拘无束)不用遵守先声明后使用的规则。solidity在执行的时候,会先将所有变量都声明创建完成后,再对他进行初始化(如果有做初始化的话):

pragma solidity >0.4.99 <0.6.0;
contract hello {
    uint a = b;

    function get() view public returns(uint) {
        return a;
    }
        
    uint b = 10;
}

其中我们在声明b之前就使用ba进行赋值。调用get方法可以得到:

代码块外.png

解释一下过程:首先先创建a,然后创建b,在创建的时候是使用默认的初始值0。然后执行a = b,所以a的值就变成了0(从get返回的结果可以看到),然后执行b = 10,这就是为什么a不是10的原因了。

通常情况

代码块内的声明就需要遵守声明顺序了,看下面这个合约,

pragma solidity >0.4.99 <0.6.0;
contract hello {
    function get() view public returns(uint) {
        uint a = b;
        uint b = 10;
        return a;
    }
}

编译上面的合约,会得到如下的报错,因为a在声明b之前就使用了b,因为此时编译器还找不到b

编译器报错.png

但是如果存在一个状态变量b的话,就不会报错了,看下面的这个合约,结合上面变量作用域中提到的规则,就可以很好的解释如下合约的输出了:

pragma solidity >0.4.99 <0.6.0;
contract hello {
    uint b = 100;
    function get1() public returns(uint) {
        b = 10;
        uint b;
        return b;
    }
    function get2() public returns(uint) {
        return b;
    }
}

get1的返回值:

get1.png

get2的返回值

get2.png

首先,在get1中,先执行的是b=10,这时候,get1中的局部变量b还没有声明,因此是引用的状态变量b(从get2的返回值可以看到),然后执行uint b,默认初始化为0(这时覆盖了状态变量的b),因此get1返回的是0

相关文章

  • Solidity - 变量作用域

    2018-10-25笔记 代码块 代码块指的就是{}所围成的代码,也就是从{开始,到}结束,花括号里面的所有的代码...

  • 第四章 作用域和内存问题

    变量的作用域? 变量作用:起作用域:区域,范围变量起作用的地方 变量的生命周期,变量生于这个作用域,死于这个作用域...

  • JS作用域链

    作用域 变量的作用域 变量的作用域有两种:全局变量和局部变量。 全局作用域: 最外层函数定义的变量拥有全局作用域,...

  • 变量作用域

    变量作用域:静态作用域、动态作用域JS变量作用域:JS使用静态作用域JS没有块级作用域(全局作用域、函数作用域等)...

  • 【前端】-023-JavaScript-进阶篇-变量作用域

    变量作用域 JavaScript中变量的作用域 采用静态作用域(变量定义的位置决定了变量的引用) 没有块级作用域,...

  • php基础知识回顾-1

    1.变量作用域 php变量有四种作用域:局部作用域、全局作用域,静态作用域、参数作用域 在局部调用全局变量需要使用...

  • js中作用域与作用域链

    js中作用域与作用域链 作用域 *作用域基本概念 作用域一般指变量的作用范围,变量分为全局变量和局部变量,对应的作...

  • 作用域与变量提升

    作用域与变量提升 作用域 JS中变量的作用域有全局作用域和局部作用域两种,作用域简单来讲就是变量与函数的可访问范围...

  • 关于作用域链

    作用域 先来谈谈变量的作用域变量的作用域无非就是两种:全局变量和局部变量。全局作用域:最外层函数定义的变量拥有全局...

  • JavaScript关于作用域、作用域链和闭包的理解

    作用域 先来谈谈变量的作用域变量的作用域无非就是两种:全局变量和局部变量。全局作用域:最外层函数定义的变量拥有全局...

网友评论

      本文标题:Solidity - 变量作用域

      本文链接:https://www.haomeiwen.com/subject/vdaqtqtx.html