Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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_Variables_Definition_Local - Fatal编程技术网

Javascript局部变量声明

Javascript局部变量声明,javascript,variables,definition,local,Javascript,Variables,Definition,Local,基本上,这是一个如何访问本地作用域处理程序的问题。我试图实现类似的全局变量定义,如: window['newObject'] = "some string"; alert(newObject); 但是对于局部范围。目前我唯一的解决方案是使用evals: eval("var newObject='some string'"); 但这真是一个丑陋的解决方案。。。最好的方法是像在window[]解决方案中一样使用对本地范围的引用,但我从未听说过对本地范围的任何引用。。。有什么想法吗 例如: fun

基本上,这是一个如何访问本地作用域处理程序的问题。我试图实现类似的全局变量定义,如:

window['newObject'] = "some string";
alert(newObject);
但是对于局部范围。目前我唯一的解决方案是使用evals:

eval("var newObject='some string'");
但这真是一个丑陋的解决方案。。。最好的方法是像在window[]解决方案中一样使用对本地范围的引用,但我从未听说过对本地范围的任何引用。。。有什么想法吗

例如:

function x(arg)
{
   localScope[arg.name]=arg.value;
   alert(sex);
}

x({name:"sex", value:"Male"});
我一定错过了什么。你想要的与仅仅做的有何不同:

 var newObject = 'some string';
??(OP澄清了问题)

我认为没有办法做到你所要求的。使用本地对象的成员,例如

function doSomething(name, value)
{
  var X = {};
  X[name] = value;
  if (X.foo == 26)
    alert("you apparently just called doSomething('foo',26)");
}

如果您选择一个1字符的变量,如$或X,它将“花费”您2个字符(变量名加一个点),并避免尝试使用eval或做一些奇怪的事情。

有趣的问题,从来没有想过这样的事情。但是用例是什么呢

您之所以要这样做,是因为您不知道变量的名称。但在这种情况下,再次访问变量的唯一方法是使用相同的引用对象。也就是说,您可以使用任何旧对象来存储数据

出于调试目的,从这样一个引用对象中读取是很有趣的,但我不明白为什么要对它进行写入

编辑:

您发布的示例没有让我相信需要访问本地范围,因为您仍然在警报中使用名称
sex
硬编码。这可以通过以下方式实施:

function x(arg)
{
  container = {};
  container[arg.name] = arg.value;
  alert(container.sex);
}

您能详细介绍一下这个示例吗?

为什么不在本地范围内创建一个对象,然后将其用作您希望动态创建的任何变量的容器

function x(arg)
{
    var localSpace = {};
    localSpace[arg.name] = arg.value;
}

好的,我找到了相关的问题,是关于我需要什么

我只记得,在ECMA 262中,使用“with”语句(当然还有eval)向作用域动态添加局部变量的唯一方法是,以下是解决方案:

var x=function(obj)
{

    with(obj) 
    {
       alert(someObj);
    }
 }
 alert(typeof someObj);


 x ( {someObj:"yea"}) ;

 alert(typeof someObj);

我不能完全肯定我理解你的问题。创建类x时,我通常会执行以下操作:

function x(args) {
  var _self = this;

  _self.PriviledgedMethod(a) {
      // some code
  }

  function privateMethod(a) {
      // some code
  }
}

var newObject = new x(args);

您可以继续访问self和args,因为它被包含的函数关闭。

您可以尝试命名参数技巧
编辑:这不是跨浏览器

function x( {sex:sex, height:height} ) {
    alert( sex );
    alert( height );
}

x( { sex: 'male', height: 'short' } );
x( { height: 'medium', sex: 'female' } );

// male
// short
// female
// medium

您要查找的对象称为调用对象。但是根据,你不能直接访问它,所以你运气不好。

不确定你到底需要什么,但这是我的2美分

在现有函数中动态创建变量的唯一方法是前面提到的eval方法

另一个选项(其他人提到过)是,函数采用上下文映射,模板使用点表示法(context.var1)访问它

我最后的建议是函数构造函数。但我觉得这可能就是你想要的。(请注意,函数构造函数遇到的问题与eval调用相同)



希望它能有所帮助

是的-我想根据我收到的函数数据动态地做这件事。我的意思是-是的,你错过了一些东西。我需要动态定义局部变量;)不惜一切代价避免评估(有时你做不到)。通过避免它,您将允许更好的缩小可能性。我要求一些完全不同的东西-如何在本地范围内动态创建变量-您可以在本地范围内动态创建“sex”时键入alert(sex),但我需要能够仅将元素作为名称引用,而不是使用localSpace[name]在每个变量之前…因为第三方希望在模板中从本地范围引用自己的值。。。解释这一点确实很复杂,但我可以向您保证,只有通过扩展局部范围(或全局范围,但对变量的访问时间更长)才能做到这一点。示例并不是为了说服您需要这样做。我在模板系统上工作,并解释为什么我需要这样做会花费很多时间,而且会非常复杂:)我只需要能够调用(alert(sex)),其中变量名可以从外部来源获取;)啊,所以归根结底,你的模板系统不允许AlertBox中有点?;-)否则,
alert(obj.someObj)
就可以了。它有一个点。。。但我试图替换过去的一些糟糕的模板系统,我需要支持您可以将本地范围中的变量放在您想要获取该模板的位置。使用块的唯一的好处是,您不必编写
警报(obj.someObj)
。以增加三行额外的代码为代价,使用“with”是件坏事。请参阅并回答“是”-这两个问题:可读性和稍慢的本地范围访问是我需要创建的模板系统可以承受的。等等:“alert(someObj)”代码来自哪里?您是自己编写的还是自动生成的代码?为什么你不能使用alert(obj.someObj)?@Jason S:我的意思就是,OP要么不能生成这个,要么发现“太多代码”无法键入。我想说添加了额外的“
obj.
”-前缀更清晰,因为函数的实际参数也不在范围之内:
alert(fakeScope.myVar)有趣的。。。这是ECMAscript,还是一种特殊的方言?(例如Spidermonkey,因为它似乎与Spidermonkey 1.7一起工作)有趣的一个。。我添加了+1:)这是JS1.7的一部分,称为分解分配。您可以将此函数声明简化为:函数x({sex,height}){…}解构赋值的Doc位于。不幸的是,它不是ECMA 5的一部分,但它在未来可能会出现。这并不能解决OP的问题,因为他们也可以做
函数x(sex,height)
,并适当地调用它……我明白了,你的意思是有一个Javascript等价于php的“变量”。可能与我以前从未听说过的术语“调用对象”重复,但您提供的链接很有用。它看起来像一个Ja
var arg1 = "first";
var arg2 = "last";

// This is the body of the function that you want to execute with first
// and last as local variables. It would come from your template
var functionBody = "alert(first + ' ' + last)";

var myCustomFun = new Function(arg1, arg2,  functionBody);

myCustomFun("Mark", "Brown"); // brings up and alert saying "Mark Brown";