Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.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 为什么Node.js中使用模块级返回语句?_Javascript_Node.js_Return_Syntax Error_Node Modules - Fatal编程技术网

Javascript 为什么Node.js中使用模块级返回语句?

Javascript 为什么Node.js中使用模块级返回语句?,javascript,node.js,return,syntax-error,node-modules,Javascript,Node.js,Return,Syntax Error,Node Modules,在回答问题时,我遇到一个Node.js模块,其中包含一个顶级return语句。例如: console.log("Trying to reach"); return; console.log("dead code"); 这本书的作品和印刷品如下: 正在尝试访问 在标准输出中,但不是“死代码””-返回实际上停止了执行 但是根据 语义 如果ECMAScript程序包含的返回语句不在函数体中,则认为该程序在语法上不正确 在上面显示的程序中,返回不在任何函数内

在回答问题时,我遇到一个Node.js模块,其中包含一个顶级
return
语句。例如:

console.log("Trying to reach");
return;
console.log("dead code");
这本书的作品和印刷品如下:

正在尝试访问
在标准输出中,但不是“
死代码”
”-
返回实际上停止了执行

但是根据

语义

如果ECMAScript程序包含的返回语句不在
函数体
中,则认为该程序在语法上不正确

在上面显示的程序中,
返回
不在任何函数内

那么这个为什么不扔呢?TL;DR

模块由Node.js包装在一个函数中,如下所示:

(function (exports, require, module, __filename, __dirname) {
    // our actual module code
});
上面显示的代码实际上是由Node.js执行的,如下所示

(function (exports, require, module, __filename, __dirname) {
    console.log("Trying to reach");
    return;
    console.log("dead code");
});
这就是为什么程序只打印试图到达的
,并跳过
返回
语句后的
控制台.log

内部构件 这就是我们需要了解Node.js如何处理模块的地方。当您使用Node.js运行.js文件时,它将其视为一个模块,并使用v8 JavaScript引擎对其进行编译

这一切都是从

在函数中,a和

这个,

由于我们的文件扩展名是
js
,因此我们可以看到
模块的扩展名为
.js
。可见

在该函数中调用
模块
对象的
\u compile
,并且

首先创建节点模块使用的函数。

function require(path) {
  return self.require(path);
}

require.resolve = function(request) {
  return Module._resolveFilename(request, self);
};

Object.defineProperty(require, 'paths', { get: function() {
  throw new Error('require.paths is removed. Use ' +
                  'node_modules folders, or the NODE_PATH ' +
                  'environment variable instead.');
}});

require.main = process.mainModule;

// Enable support to add extra extension types
require.extensions = Module._extensions;
require.registerExtension = function() {
  throw new Error('require.registerExtension() removed. Use ' +
                  'require.extensions instead.');
};

require.cache = Module._cache;
然后是关于包装代码的内容

// create wrapper function
var wrapper = Module.wrap(content);
我们开始寻找
Module.wrap
的功能

这就是我们发现这个的地方

NativeModule.wrap = function(script) {
  return NativeModule.wrapper[0] + script + NativeModule.wrapper[1];
};

NativeModule.wrapper = [
  '(function (exports, require, module, __filename, __dirname) { ',
  '\n});'
];
这就是我们的程序访问神奇变量的方式,
导出
要求
模块
文件名
目录名

然后,使用

最后,调用模块的已编译包装函数对象,如,为、、和填充值

这就是Node.js处理和执行模块的方式,这就是为什么
return
语句能够正常工作的原因

// Native extension for .js
Module._extensions['.js'] = function(module, filename) {
  var content = fs.readFileSync(filename, 'utf8');
  module._compile(stripBOM(content), filename);
};
// Run the file contents in the correct scope or sandbox. Expose
// the correct helper variables (require, module, exports) to
// the file.
// Returns exception, if any.
function require(path) {
  return self.require(path);
}

require.resolve = function(request) {
  return Module._resolveFilename(request, self);
};

Object.defineProperty(require, 'paths', { get: function() {
  throw new Error('require.paths is removed. Use ' +
                  'node_modules folders, or the NODE_PATH ' +
                  'environment variable instead.');
}});

require.main = process.mainModule;

// Enable support to add extra extension types
require.extensions = Module._extensions;
require.registerExtension = function() {
  throw new Error('require.registerExtension() removed. Use ' +
                  'require.extensions instead.');
};

require.cache = Module._cache;
// create wrapper function
var wrapper = Module.wrap(content);
Module.wrap = NativeModule.wrap;
NativeModule.wrap = function(script) {
  return NativeModule.wrapper[0] + script + NativeModule.wrapper[1];
};

NativeModule.wrapper = [
  '(function (exports, require, module, __filename, __dirname) { ',
  '\n});'
];
var compiledWrapper = runInThisContext(wrapper, { filename: filename });
var args = [self.exports, require, self, filename, dirname];
return compiledWrapper.apply(self.exports, args);