Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript webworker-thead中的闭包_Javascript_Node.js_Closures - Fatal编程技术网

Javascript webworker-thead中的闭包

Javascript webworker-thead中的闭包,javascript,node.js,closures,Javascript,Node.js,Closures,当我在node.js中研究worker线程时,我遵循了webworker threads npm包网站上的说明,实现了以下代码,但有点错误。这让我重新思考结束 const express = require("express"); const app = express(); const Worker = require("webworker-threads").Worker; app.get("/", (req, res) => { // let counter = 0; //

当我在node.js中研究worker线程时,我遵循了webworker threads npm包网站上的说明,实现了以下代码,但有点错误。这让我重新思考结束

const express = require("express");
const app = express();
const Worker = require("webworker-threads").Worker;
app.get("/", (req, res) => {
  //   let counter = 0; // if i put this here code is not working
  const worker = new Worker(function() {
    this.onmessage = function() {
      let counter = 0;
      while (counter < 1000000) {
        counter = counter + 1;
      }
      this.postMessage(counter);
    };
  });
  worker.onmessage = function(result) {
    console.log(result);
    res.send(result);
  };
  worker.postMessage();
});
app.get("/fast", (req, res) => {
  res.send("this is fast");
});
app.listen(3100, () => {
  console.log("listening");
});
我错误地将let counter=0放在worker函数之外,但服务器挂起,无法加载。然后我把它放在worker函数中,尝试一些不同的东西,它成功了

但我该如何描述这一点呢?这是正确的吗

辅助函数无法访问其关闭

在本例中,为什么不允许辅助函数访问其闭包?因为只有一个函数需要访问
让counter=0

闭包是函数和声明该函数的词法环境的组合。因此,即使在外部函数返回后,内部函数也可以访问外部函数的变量。 现在,当我们谈到它的应用程序时,我们知道node.js不支持访问说明符,而闭包允许我们这样做 下面是一个相同的例子:

a = (function () {
  var privatefunction = function () {
    alert('hello');
  }

  return {
    publicfunction : function () {
        privatefunction();
    }
  }
})();
1.面向对象编程的替代方案 理论上,任何可以使用类/构造函数的地方都可以使用闭包。它们本质上都执行相同的任务:封装数据和维护状态——但通过不同的机制。对象使用上下文维护状态,Java称之为作用域,但因为Java实际上没有真正的作用域,闭包使用作用域来维护状态

闭包对于替换单个方法类特别有用,令人惊讶的是,这些方法类有许多用途:

让我们看一个简单的文件记录器。OO实现可以是:

class Logger {
    constructor (filename) {
        this.logfile = fs.openSync(filename,'a');
        this.log.bind(this);
    }

    log (txt) {
        const now = new Date().toISOString();
        fs.write(this.logfile, `${now} : ${txt}\n`);
    }
}

// usage:
const logger = new Logger('file.log');
logger.log('Hello');
可以使用闭包来实现相同的逻辑:

function makeLogger (filename) {
    const logfile = fs.openSync(filename,'a');

    return function (txt) {
        const now = new Date().toISOString();
        fs.write(logfile, `${now} : ${txt}\n`); // <-- using closure here!
    }
}

// usage:
const log = makeLogger('file.log');
log('Hello');
根据您与谁交谈,闭包实现更容易阅读。我是比类更喜欢闭包的人之一。它不仅较短,而且还包含状态,不能从其他代码更改

2.通常,在任何需要新范围的地方都需要隐藏某些内容 因为函数是操作作用域的唯一机制,所以还需要使用闭包来创建作用域。这在安全关键代码中尤其有用,例如处理需要与第三方库交互的身份验证和金融交易的代码

2.1. 节点模块 Node.js特别使用闭包来实现javascript:file范围中不存在的东西

节点中的模块加载到IIFE中,从而创建一个闭包。模块文件中的所有变量对文件闭包中定义的所有函数都可见,但对其他模块不可见,除非声明时没有var、let或const。Ryan Dahl不想将Javascript作为一种语言进行修改,只想在该语言的基础上添加一个框架,使其在浏览器之外变得有用。幸运的是,Javascript足够强大,并且有闭包,这是可能的

现实世界的例子 有几个大规模使用闭包的真实例子:

React.FunctionComponent是React.js中最新的功能,它允许用户使用闭包来实现React组件,而不是类。这通常会减少代码行和复杂性是的,这与前端相关,但规模非常大

js经常使用闭包来跟踪异步操作

Express.js是混合的。虽然大多数代码都是面向对象的,但它也使用闭包,特别是在中间件/路由体系结构中


对于Stackoverflow问题来说,很多、多种多样且过于宽泛。一般来说,几乎在任何可以使用类/构造函数的地方,都可以使用闭包。理论上,闭包和对象是等价的——它们都保持状态。我相信甚至有一篇论文证明了这一点,但不要引用我的话that@Quentin我想既然我的问题被搁置了,我现在不能问任何问题。我如何解决这个问题?我必须等到暂停标志取消吗。几天前我编辑了这个问题,今天我也添加了更多的细节,它仍然被搁置。直到我不能问问题的时候。我必须问一些紧急问题:webworker线程库有点奇怪,因为它打破了闭包的概念。辅助线程API不能与代码的其余部分在同一范围内运行。实际上,原始API执行一个单独的javascript文件。匿名函数是一种黑客行为。API所做的是将函数体转换为字符串,并将其视为工作源文件-显然,字符串没有以任何方式链接到主线程的内存-因此,您想要创建的任何闭包(就像计数器不工作一样)通常会避免此类库,并更多地依赖于并发性而不是并行性除非我真的需要它。当我使用这些东西时,我一定要记住,它并不像普通的JavaScription那样工作,你似乎根本没有读过这个问题。问题是,你只是在描述什么是结束
我知道什么是结束。它是在询问真实世界中有用的例子。这就是例子所说的!你必须阅读完整的答案。我解释了闭包,因为你对闭包的定义没有正确解释!兄弟看起来你是node.js教授。我应该直接问你我的问题,因为其他人投了反对票:你有没有关于node.js或javascript的好书可以推荐。好的老javascript:Douglas Crockford的好部分仍然很好,尽管它没有涵盖为ES3编写的语言的更新版本。或者在youtubeI上搜索Douglas Crockford刚刚订购了那本书,还有他的新书《JavaScript如何工作》。jsnode.js的任何好的源代码如果您已经在学习高级javascript,那么您不需要任何特定于节点的书籍。只需阅读节点文档并熟悉提供的标准库