Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.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 如何从另一个文件更改函数中的变量?_Javascript_Node.js - Fatal编程技术网

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

Javascript 如何从另一个文件更改函数中的变量?,javascript,node.js,Javascript,Node.js,我有一些这样的代码: //app.js var r=require("./second.js"); var a=1; r.second(a); console.log(a); 我的second.js如下所示: //second.js module.exports.change=function(a){ a=2; } 目前console.log(a)只显示1,我做了一些研究,说我不能将它作为变量传递,因为变量是作为值传递的。我考虑过使用global.a。但是,它也不起作用,因为a存储为

我有一些这样的代码:

//app.js
var r=require("./second.js");
var a=1;
r.second(a);
console.log(a);
我的second.js如下所示:

//second.js
module.exports.change=function(a){
    a=2;
}
目前console.log(a)只显示1,我做了一些研究,说我不能将它作为变量传递,因为变量是作为值传递的。我考虑过使用global.a。但是,它也不起作用,因为a存储为模块变量,而不是全局变量,我不想将其设置为全局变量


如何解决它?

最初,没有任何函数被称为
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);

第一种方法是在
second.js
中的
change
函数中返回

app.js:

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

module.exports.change=function(a){
    a=2;
    return a;
}
module.exports.change=function(obj){
    obj.a=2;
}
第二种方法是使用对象作为参数,通过引用传递:

app.js:

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

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

您可以使用localStorage或sessionStorage设置和获取变量。 对于NodeJS,您可以使用包

可以使用localStorage.getItem('key')获取


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

还有许多其他的方法可以使模块B修改模块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;
};
// inside of moduleB
module.exports.someFunction = function(obj) {
    obj.someProperty = 2;
};
将值放入对象并将引用传递给对象 与将值存储在简单变量中不同,您可以将其存储为对象的属性,然后向该对象传递引用。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(a) {
    return ++a;
};
// inside of moduleB
module.exports.someFunction = function(obj) {
    obj.someProperty = 2;
};