脚本与命令行中节点中的全局变量分配

蒙纳人

我有以下脚本:

/* script.js */
var bar = "bar1";

function foo() {
    console.log('this.bar: ' + this.bar);
    console.log('global.bar: ' + global.bar);
}
foo();

运行node script.js收益:

this.bar: undefined
global.bar: undefined

但是,从节点命令行环境内部,复制相同的脚本将返回:

this.bar: bar1
global.bar: bar1

另外,如果我改变从我的变量声明var bar = "bar1";global.bar = "bar1";运行上面的代码返回的两种方法:

this.bar: bar1
global.bar: bar1

有什么不同?在同一环境中运行脚本与重现脚本时,全局变量分配是否有所不同?

日拉克

仅仅因为每个节点模块都包装在某种IIFE中,所以默认情况下您不在全局范围内。

我们可以src/node.jsNativeModule函数的中看到它的发生

NativeModule.require = function(id) {
    // ...
    var nativeModule = new NativeModule(id);

    nativeModule.cache();
    nativeModule.compile();

    return nativeModule.exports;
};

沿着足迹,我们调查compile

NativeModule.prototype.compile = function() {
    var source = NativeModule.getSource(this.id);
    source = NativeModule.wrap(source);

    var fn = runInThisContext(source, { filename: this.filename });
    fn(this.exports, NativeModule.require, this, this.filename);

    this.loaded = true;
};

wrap 看起来很相关,让我们看看它的作用:

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

NativeModule.wrapper = [
    '(function (exports, require, module, __filename, __dirname) { ',
    '\n});'
];

令人怀疑的是,它将模块的代码包装在IIFE中,这意味着您不在全局范围内运行。

另一方面,默认情况下,REPL在全局范围内运行。遵循REPL代码是meh,但基本上可以归结为这一行

if (self.useGlobal) {
    result = script.runInThisContext({ displayErrors: false });
} else {
    result = script.runInContext(context, { displayErrors: false });
}

看起来与我无关。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

节点中的全局变量

来自分类Dev

如何在cmd中的setx命令的参数中使用全局变量(命令行)

来自分类Dev

从命令行读取常量作为全局变量

来自分类Dev

Windows命令行:如何在调用中设置全局变量?

来自分类Dev

使用现有的全局变量在Node.js中执行命令行参数?

来自分类Dev

如何在TS节点中的初始化全局变量中声明?

来自分类Dev

在shell脚本中通过变量获取命令行参数

来自分类Dev

通过命令行分配gulp变量

来自分类Dev

节点的全局变量

来自分类Dev

从全局变量节点js分配局部变量

来自分类Dev

在脚本中停止命令行命令

来自分类Dev

在Java脚本中声明全局变量

来自分类Dev

节点js中的命令行参数

来自分类Dev

在命令行/母脚本中覆盖AWK脚本中的变量

来自分类Dev

在命令行/母脚本中覆盖AWK脚本中的变量

来自分类Dev

Python脚本中的命令行

来自分类Dev

在bash脚本中获取命令行

来自分类Dev

在命令行中像bin程序一样运行节点脚本

来自分类Dev

在命令行中定义变量

来自分类Dev

对于gawk,命令行中的变量分配是否需要遵循-v?

来自分类Dev

将命令行参数分配给变量

来自分类Dev

Python命令行参数分配给变量

来自分类Dev

如何分配包含!的命令行参数 和&变量?

来自分类Dev

命令行参数未分配给变量

来自分类Dev

将环境变量传递到php命令行脚本中

来自分类Dev

在Lua中为全局变量分配功能

来自分类Dev

通过编码在Access 2007中分配全局变量

来自分类Dev

在shell脚本中使用变量作为命令行输入

来自分类Dev

从命令行调用Bash脚本变量