全局变量在全局范围

时间:2016-10-30 18:02:09

标签: javascript

首先,我很抱歉问过以前看似曾问过的,但...... 在我发现的问题中,人们谈论范围(我熟悉这个概念)或关于一些我不太了解的“回调”或“异步”的事情。我之所以这样问是因为到目前为止我所有的全局变量通常都受到大量函数的影响。 我的代码对我来说太大了,不能在这里粘贴,但我会给你一个例子。

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

现在问题是,当我将它们传递给函数时,它理解这两个变量并获得正确的结果,但是,ContainsSomeNumber变量在全局范围内不受该函数的影响。如果我发出一个警告或日志来显示它在函数中的含量,它会显示55,就像它应该的那样。但是一旦我成功运行函数(chrome和firefox显示没有犯规)后我尝试在另一个地方使用修改后的值访问修改后的全局变量,它将返回相同的未修改值50。 问题是因为我没有使用硬编码版本的变量来传递函数,还是什么?因为就像我说的那样,它以正确的方式查看和修改它,但只在函数内部。范围不应该将变量视为全局变量,因为我没有在函数中使用的变量前面写“var”吗?我的意思是,我没有将它声明为一个新变量,而且它通常采用了它的全局值。为什么全局变量不会被函数修改?

1 个答案:

答案 0 :(得分:0)

Javascript总是按值传递,但是当变量引用对象(包括数组)时,“value”是对象的引用。 因此,如果您希望函数修改范围外的变量,则应传递一个对象并更改对象内的某些属性。

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
}