将一个文件中的上下文传递给另一个文件中定义的函数

时间:2019-06-05 02:38:57

标签: javascript node.js

第一个文件utils.js具有模仿shell的功能,以便用户可以输入javascript代码:

const readline = require('readline-sync');

var x = {
  shell: function(){ 
    while(1) {
      let code = readline.question(">> ");
      try {
          console.log(eval(code)); 
      } catch (e) {
          console.log(e.message);
      }
    }
  }
}

module.exports = x;

第二个文件main.js使用上面的shell函数:

const utils = require('./utils.js');

var country = "india";
var names = ["x", "y", "z"]
function foo(){...}
function bar(){...}

utils.shell();

我一直试图将Second文件的上下文传递给shell函数,以便能够从外壳程序中访问Second文件中的函数和变量。但是到目前为止我还没有成功。 enter image description here

我对call和其他一些方法感到有些困惑,但它们都失败了。任何帮助都将受到高度赞赏。

注意:
utils.shell.call(this)正在将一个空对象{}传递给shell函数

2 个答案:

答案 0 :(得分:2)

在上面的main.js中,您已经使用var声明了变量。因此,不会在 this 上下文中进行设置。所以我以这样的方式重写了代码,

main.js

const utils = require('./utils.js');

country = "india";
names = ["x", "y", "z"];
foo = function (){

}
bar = function (){

}
utils.shell.call(this);

和utils.js

const readline = require('readline-sync');

var x = {
  shell: () => { 
    while(1) {
      let code = readline.question(">> ");
      try {
          console.log(eval(code)); 
      } catch (e) {
          console.log(e.message);
      }
    }
  }
}

module.exports = x;

现在在utils中,您将不会得到空对象,而是会得到所有四个成员(foo,bar,country,names)。

答案 1 :(得分:1)

您可以将所有内容放入对象中,将其作为参数传递给utils.shell,并让utils.shellglobal上公开吗?

const context = {
  country: 'india',
  names: ['x', 'y', 'z'],
  foo: () => console.log('foo')
}

utils.shell(context);
shell: function(context){
  Object.assign(global, context); 

  while(1) {
    let code = readline.question(">> ");
    try {
      console.log(eval(code)); 
    } catch (e) {
      console.log(e.message);
    }
  }
}