从调用范围访问javascript变量

从调用范围访问javascript变量,javascript,string,scope,Javascript,String,Scope,我试图定义一个函数,它可以访问调用它的函数范围内的变量 (我正在尝试构建一个比“a”+b更漂亮、比string.format(“a{0}”,b)更简洁的字符串格式化程序。因此我可以得到SF(“a{b}”),我不知道这是否可行) 所以 函数魔术(str){ 返回parentScope[str];//或返回eval(str); //或者类似的 } 函数调用(){ var a=1; 警觉(魔术);; } call(); 将提醒“1” 目前,我可以通过评估函数返回码来实现这一点,但似乎有更好的方法。只需

我试图定义一个函数,它可以访问调用它的函数范围内的变量

(我正在尝试构建一个比“a”+b更漂亮、比string.format(“a{0}”,b)更简洁的字符串格式化程序。因此我可以得到SF(“a{b}”),我不知道这是否可行)

所以

函数魔术(str){ 返回parentScope[str];//或返回eval(str); //或者类似的 } 函数调用(){ var a=1; 警觉(魔术);; } call(); 将提醒“1”


目前,我可以通过评估函数返回码来实现这一点,但似乎有更好的方法。

只需将您的“魔法”函数放入调用函数中:

function call() {
    function magic(str) {
        return a; 
    }

    var a = 1;
    alert( magic() );
}
call();
这种幕后机制称为闭包,这是一个非常强大的概念。试想一个AJAX请求,其中回调函数仍然可以访问调用函数的局部变量

更新

我误解了你的问题。您实际上想要构建的东西不可能在JavaScript中实现,因为无法访问调用方的作用域

更新2

这是我的字符串格式化函数。虽然没有您想要的那么简洁,但仍然非常有用

String.prototype.arg = function()
{
    result = this;

    // This depends on mootools, a normal for loop would do the job, too  
    $A(arguments).each((function(arg) 
    {
        result = result.replace("%", arg);
    }).bind(this));

    return result;
}
您可以像这样使用它:

"%-% %".arg(1,2).arg(3)
接收

"1-2 3"

据我所知,从javascript中的函数中获取任意变量是不可能的。来自对象是,但不是来自执行方法


我想不出任何函数方法(apply、call或其他)能在这方面帮助你:坦白地说,我认为你太努力了,因为它比正常的string.format,呃。。。格式。

@sebasgo是正确的,你不能完全按照你想做的去做。但我想你可能想看看Prototype的方法:

“{transport}上的{animals}”。插入({animals:“猪”,transport:“冲浪板”);
//->“冲浪板上的猪”
var语法=/(^ |.|\r |\n)(\)///匹配像“”这样的符号
var html='Name:,Age:';
插入({姓名:'John Smith',年龄:26},语法);
//->姓名:约翰·史密斯,年龄:26岁

考虑到问题的上下文,我认为这没有什么帮助-他希望根据格式从字符串中提取任意变量名。以前有一个“arguments.caller”和一个“arguments.callee.caller”来获取父级,但实现依赖于浏览器,越来越不受欢迎。我认为即使是arguments.callee也可能最终被弃用。最好远离这一切。
"1-2 3"
"#{animals} on a #{transport}".interpolate({ animals: "Pigs", transport: "Surfboard" });
//-> "Pigs on a Surfboard"

var syntax = /(^|.|\r|\n)(\<%=\s*(\w+)\s*%\>)/; //matches symbols like '<%= field %>'
var html = '<div>Name: <b><%= name %></b>, Age: <b><%=age%></b></div>';
html.interpolate({ name: 'John Smith', age: 26 }, syntax);
// -> <div>Name: <b>John Smith</b>, Age: <b>26</b></div>