除了异常之外,是否可以在 JavaScript 中实现非本地返回?

发布于 2024-10-01 00:22:21 字数 275 浏览 3 评论 0原文

非本地返回可以在 JavaScript 中实现吗?这样您就可以编写如下内容:

function some_function() {
  function some_other_function(value) {
   non-local-return true;
  }
  some_other_function();
  return false;
}

true === some_function();

那么,some_function 将返回 true 吗?

Can non-local-returns be implemented in JavaScript, so that you could write something like:

function some_function() {
  function some_other_function(value) {
   non-local-return true;
  }
  some_other_function();
  return false;
}

true === some_function();

where some_function would return true, then?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

双马尾 2024-10-08 00:22:21

很简单,不。

(类似的问题在这里: let-a-function-return-the -超级功能)

Quite simply, no.

(similar question here: let-a-function-return-the-super-function)

待天淡蓝洁白时 2024-10-08 00:22:21

模拟非本地返回的标准方法是使用异常:

function boundary(f) {
  try {
    return f();
  } catch (exc) {
    if ("__nlr" in exc) {
      return exc.result;
    } else {
      throw exc
    }
  }
}

function nonLocalReturn(value) {
  throw { __nlr: true, result: value }
}

boundary 将界定可以发生非本地返回的范围,而 nonLocalReturn 将简单地包装在一个奇特的对象中增加“返回”值,然后抛出它。

可以(理论上)使用它来实现类似于 findFirstforEach: 的功能,

function findFirstWithForEach(arr, pred) {
  return boundary(() => {
    arr.forEach(elem => {
      if (pred(elem)) {
        nonLocalReturn(elem);
      }
    })
  });
}

这样

findFirstWithForEach([1, 3, 5, 42, 7, 9], x => x % 2 == 0)

就能找到 42

您的具体示例将变得

function some_function() {
  function some_other_function(value) {
    nonLocalReturn(true);
  }
  return boundary(() => {
    some_other_function();
    return false;
  })
}

显然,尽管正确,但这与好的或有用的东西无关。请不要在任何实际代码中使用它。

The standard way to simulate non-local returns is to use exceptions:

function boundary(f) {
  try {
    return f();
  } catch (exc) {
    if ("__nlr" in exc) {
      return exc.result;
    } else {
      throw exc
    }
  }
}

function nonLocalReturn(value) {
  throw { __nlr: true, result: value }
}

The boundary would delimit a scope in which the non-local return can occur, and the nonLocalReturn would simply wrap up the "returned" value in a fancy object, and throw it.

You could (theoretically) use it to implement something like findFirst with forEach:

function findFirstWithForEach(arr, pred) {
  return boundary(() => {
    arr.forEach(elem => {
      if (pred(elem)) {
        nonLocalReturn(elem);
      }
    })
  });
}

so that

findFirstWithForEach([1, 3, 5, 42, 7, 9], x => x % 2 == 0)

would find the 42.

Your specific example would become

function some_function() {
  function some_other_function(value) {
    nonLocalReturn(true);
  }
  return boundary(() => {
    some_other_function();
    return false;
  })
}

Obviously, despite being true, this has nothing to do with what's good or useful. Please don't use it in any real code.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文