如何从另一个文件更改函数中的变量?

时间:2017-06-24 04:16:37

标签: javascript node.js

我有一些像这样的代码:

 // GET: api/Users/abcde12345
[HttpGet("{nameIdentifier:nameId}")]
[Authorize]
public async Task<IActionResult> GetUserByNameIdentifier([FromRoute] string nameIdentifier)
{
    if (!ModelState.IsValid)
        return BadRequest(ModelState);

    User user = await _context.User.SingleOrDefaultAsync(m => m.NameIdentifier == nameIdentifier);

    if (user == null)
        return NotFound();

    return Ok(user);
}

我的second.js看起来像这样:

//app.js
var r=require("./second.js");
var a=1;
r.second(a);
console.log(a);

目前console.log(a)只显示1,我做了一些研究,说我不能将它作为变量传递,因为变量作为值传递。我想过使用global.a。但是,它也不起作用,因为a存储为模块变量,而不是全局变量,我不想将其设置为全局变量。

我该如何解决?

4 个答案:

答案 0 :(得分:3)

主要答案是你不能完全按照你的要求去做。在app.js中定义为a的变量是a范围内的私有,只有app.js中的其他代码可以修改它。

您可以通过许多其他方式来构建模块,以便模块B可以修改模块A中的某些内容,或者在模块A中修改某些内容。

全局

您可以a全局。出于各种原因,不建议这样做。但是您可以通过将a的声明更改为:

来使其成为全局对象的属性
global.a = 1;

然后,在模块B中,您可以直接设置:

global.a = 2;

通过和返回

您可以将a传递给模块B中的函数,并让该函数返回一个新值,并将其分配回a

const b = require('moduleB');

let a = 1;
a = b.someFunction(a);
console.log(a);    // 2

然后,在moduleB内部,您可以直接修改a上的属性:

// inside of moduleB
module.exports.someFunction = function(a) {
    return ++a;
};

将值放在object中并将引用传递给object

您可以将其存储为对象的属性,然后将引用传递给该对象,而不是将值存储在简单变量中。 Javascript中的对象由ptr传递,因此您传递对象的其他一些函数可以直接修改其属性。

const b = require('moduleB');

let a = {someProperty: 1};

b.someFunction(a);
console.log(a.someProperty);    // 2

然后,在moduleB内部,您可以直接修改a上的属性:

// inside of moduleB
module.exports.someFunction = function(obj) {
    obj.someProperty = 2;
};

答案 1 :(得分:1)

最初,没有任何名为second的函数。您的模块公开了一个名为change的函数。然后,当您将值传递给函数时,将复制此值,并且您执行的任何更改仅影响副本。因此传递a的值时,更改仅影响此值的副本,而不影响原始值的副本。你能做的是传递一个物体。这次传递了对象引用的副本。因此,您所做的任何更改都会反映回原始对象(它就像C和C ++中的指针一样)。

就代码而言,您应该做出以下更改:

// You could make the method more dynamical passing the value you want a get.
module.exports.change = function(obj, value){
    obj.a = value;
}

最后你应该把它称为:

var r=require("./second.js");
var obj = { a: 1};
r.change(obj,2);
console.log(obj.a);

答案 2 :(得分:0)

第一种方式将在change的{​​{1}}函数中返回。

app.js:

second.js

second.js:

var r=require("./second.js");
var a=1;
a = r.change(a);
console.log(a);

第二种方式是使用object作为参数来通过引用传递它:

app.js:

module.exports.change=function(a){
    a=2;
    return a;
}

second.js:

var r=require("./second.js");
var obj={a:1};
r.change(obj);
console.log(obj.a);

答案 3 :(得分:0)

您可以使用localStorage或sessionStorage来设置和获取变量。 对于节点js,您可以使用https://www.npmjs.com/package/localStorage

tntwars

您可以使用localStorage.getItem('key')

//You can set using localStorage.setItem('key','value')

var r = require("./second.js");
var a = 1;
localStorage.setItem('a', 1) /*Window api for setting variable locally 
localStorage.setItem('key','value')*/
r.second(a);
console.log(a);