Javascript局部变量声明

时间:2009-07-13 13:06:33

标签: javascript variables definition local

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

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

8 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:1)

我必须遗漏一些东西。你想要的不仅仅是做什么:

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

Okey我发现相关的问题正在谈论我需要什么......

How can I access local scope dynamically in javascript?

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

var x=function(obj)
{

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


 x ( {someObj:"yea"}) ;

 alert(typeof someObj);

答案 4 :(得分:1)

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

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

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

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

答案 5 :(得分:1)

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

在现有函数中动态创建变量的唯一方法是您已经提到过的eval方法。

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

我的最终建议是Function构造函数。但我有一种感觉,这可能是你正在寻找的。 (注意,函数构造函数遇到与eval调用相同的问题)

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

希望有所帮助

答案 6 :(得分:0)

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

你想要做这样的事情的原因是你不知道变量的名称。但在那种情况下,再次访问变量的唯一方法是使用相同的引用对象。即你可以使用任何旧对象来存储数据。

从这样的参考对象中读取对于调试来说会很有意思,但我不明白你为什么要写它。

修改

您发布的示例并不能说服我需要访问本地范围,因为您仍然在警报中对名称sex进行了硬编码。这可以实现为:

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

你能详细说明这个例子吗?

答案 7 :(得分:-1)

我不完全确定我理解你的问题。创建类x时,我通常会这样做:

function x(args) {
  var _self = this;

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

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

var newObject = new x(args);

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