Thanks to visit codestin.com
Credit goes to developer.mozilla.org

此页面由社区从英文翻译而来。了解更多并加入 MDN Web Docs 社区。

View in English Always switch to English

block

block 语句创建一个标签,后面可以用 br 跳出该块。

loop 语句和 block 语句的表现相反,跳转到 loop 会回到循环的开头,而跳转到 block 会达到块尾,也就是跳出块。

尝试一下

(module
  ;; 导入浏览器 console 对象,你需要将其从 JavaScript 传入
  (import "console" "log" (func $log (param i32)))

  ;; 创建一个函数,接收一个数字作为参数,
  ;; 并当该数字不等于 100 时打印它。
  (func (export "log_if_not_100") (param $num i32)
    (block $my_block

      ;; 判断 $num 是否等于 100
      local.get $num
      i32.const 100
      i32.eq

      (if
        (then

          ;; 跳转到块尾
          br $my_block

        )
      )

      ;; 当 $num 等于 100 时,不会到达这里
      local.get $num
      call $log

    )
  )
)
const url = "{%wasm-url%}";
await WebAssembly.instantiateStreaming(fetch(url), { console }).then(
  (result) => {
    const log_if_not_100 = result.instance.exports.log_if_not_100;

    log_if_not_100(99);
    // 期望的输出:99
    log_if_not_100(100);
    // 不应该打印任何东西
    log_if_not_100(101);
    // 期望的输出:101
  },
);

语法

wat
;; 对块打标签,使其可以被跳转。
(block $my_block

  ;; 跳转到该块。
  ;; 大多数时候,你会想要将下面的指令放在 if 语句中,仅在符合条件时跳转,
  ;; 否则,后面的控制流就无法到达。
  br $my_block

  ;; 永远不会到达这里,因为 br 早已经跳出了该块。
  unreachable

)
指令 二进制操作码
block 0x02