Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.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 - Fatal编程技术网

Javascript 如何引用已在函数的参数中引用的全局变量?

Javascript 如何引用已在函数的参数中引用的全局变量?,javascript,Javascript,假设globalX是一个全局对象变量。让我们定义一个函数,该函数接受该变量,在另一个函数中接受相同的变量并更改其中的值 var globalX = []; function a1(globalX){ a2(globalX); console.log(globalX); //it shows "[]" not "[5,10]"; } function a2(globalX){ globalX = [5,10]; } a1(globalX); 当我控制台那个变量时,控制台只显示a

假设globalX是一个全局对象变量。让我们定义一个函数,该函数接受该变量,在另一个函数中接受相同的变量并更改其中的值

var globalX = [];

function a1(globalX){

a2(globalX);
console.log(globalX);
 //it shows "[]" not "[5,10]";

}

function a2(globalX){
globalX = [5,10];
}   

a1(globalX);

当我控制台那个变量时,控制台只显示a1中的参数值,而不显示a2函数中的更改值。调用a2后如何引用更改的值?

简短的回答是

越长越好,因为JavaScript使用作用域。如果再次定义同一变量,它将覆盖父变量。有一些技巧可以获得它,但它们都包括对父对象的引用。以下是几个例子:

var start = 'start';
console.log(start); // 'start'

function test(start) {
    console.log(start); // 'test' - you got no reference to previous start
}
test('test');
全局使用(窗口):

但是请记住,这个是可以改变的。因此,没有真正的证据表明你能得到它

有时,您可以这样做:

function main() {
    this.start = 'start';

    return function(start) {
        console.log(start); // 'test'
        console.log(this.start); // 'start'
    }
}
var class = main();
class.test('test');

这完全取决于你的结构,以及你是否将你的东西包装在函数中最好的做法是使用不同的名称。在某些语言中,通常在变量前面加上
\u
,如
\u start
,这意味着它们是
成员变量(尽可能多的顶级变量)。有些人甚至给参数的变量添加后缀(
start_uuz
),以便知道发生了什么。我不喜欢,但仍然如此。

在浏览器环境中,您可以通过显式引用
窗口
对象来引用全局变量:

var reallyGlobalX = window.globalX
在node.js中,没有
窗口
对象,但是
全局
可用:

var reallyGlobalX = global.globalX

请注意,该变量必须是全局变量-如果它只是外部作用域中的另一个变量,那么一旦该变量被隐藏,您就无法访问它。

什么类型的globalx?还可以发布a2函数吗?若要在局部变量使用相同名称时引用全局变量,通常可以使用
窗口。globalvariable
如果globalx是一个对象,则它将作为引用传递,因此a2方法对其属性所做的任何更改都将在下一行中注销。如果globalx是一个简单类型(string/int),它将按值传递。可能是重复的Yup,这是重复的。我真的无法理解你的答案,你能看看我编辑的问题吗?如果我们在任何函数中都不使用var,我们也应该使用window?你应该只在需要时使用它,即局部变量会遮挡全局变量。通过在作用域中声明变量或将函数的参数命名为全局变量,可以实现隐藏。一般来说,我们建议只重命名局部变量或避免使用全局作用域。您的意思是,如果我定义了“函数a1(globalA1Par){…}函数a2(globalA2Par){…}”,它是否解决了?您是对的,我测试了它,并且在更改函数参数名称时,它工作正常。但即使在这种情况下,如果我们不知道全局变量的真实名称,如果它的值发生变化,我们也无法访问它。参数在调用主函数时仅保存旧值。我认为这是一个糟糕的Javascript设计。
var reallyGlobalX = global.globalX