在全局作用域中不受其影响的函数中传递的全局变量

Global variable passed in a function not affected by it on the global scope

本文关键字:全局变量 函数 影响 全局 作用域      更新时间:2023-09-26

首先,我很抱歉问这个问题,似乎之前问过,但是…在我发现的问题中,人们谈论作用域(我对这个概念很熟悉)或一些我不太理解的"回调"或"异步"事情。我问这个问题的原因是因为到目前为止,我所有的全局变量,通常都受到大量函数的影响。我的代码太大了,我不能粘贴在这里,但我会给你一个例子。

var ContainsSomeNumber = 50;
var AnObjectWithSomeValues ...
var TheFunctionInQuestion = function(nameRepresentingTheObject, nameRepresentingNumberVar){
   if(nameRepresentingTheObject.lestSayName ==== "SomeString"){
      nameRepresentingNumberVar+=5;
   }
}

现在的事情是,它理解这两个变量,并得到正确的结果,当我把它们传递给函数,但是,ContainsSomeNumber变量仍然不受全局范围内的函数的影响。如果我放置一个警报或日志来显示它在函数中有多少,它会显示为55,这是应该的。但是,在函数成功运行之后(chrome和firefox没有显示任何错误),我试图在另一个地方访问修改后的全局变量,它返回相同的未修改值50。问题是因为我没有使用变量的硬编码版本来传递函数,还是什么?因为就像我说的,它以正确的方式观察和修改它,但只是在函数内部。不应该范围看到变量作为一个全局的,因为我没有写"var"在前面的一个我在函数中使用?我的意思是,我没有将它声明为一个新变量,加上它通常取它的全局值。为什么全局变量不被函数修改?

Javascript总是按值传递,但是当变量引用对象(包括数组)时,"值"是对对象的引用。因此,如果你想让一个函数在作用域之外修改一个变量,你应该传递一个对象并改变对象内部的一些属性。

var obj = {
  ContainsSomeNumber: 50;
}
var AnObjectWithSomeValues ...
var TheFunctionInQuestion = function(nameRepresentingTheObject, obj){
   if(nameRepresentingTheObject.lestSayName === "SomeString"){
      obj.ContainsSomeNumber+=5;
   }
}

或者你可以返回值:

var ContainsSomeNumber = 50;
var AnObjectWithSomeValues ...
var TheFunctionInQuestion = function(nameRepresentingTheObject, nameRepresentingNumberVar){
   if(nameRepresentingTheObject.lestSayName === "SomeString"){
      nameRepresentingNumberVar+5;
   }
   return nameRepresentingNumberVar
}