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;
};