基本上这是一个如何访问本地范围处理程序的问题。我试图为全局变量定义实现类似的东西,如:
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"});
答案 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,因为它已被包含的函数关闭。