从调用范围访问javascript变量

时间:2009-08-03 18:56:27

标签: javascript string scope

我正在尝试定义一个函数,该函数可以访问调用它的函数范围内的变量。

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

所以

function magic(str) {
    return parentScope[str]; // or return eval( str );
    // or something like that
}

function call() {
    var a = 1;
    alert( magic( "a" ) );
}
call();

警告“1”。

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

3 个答案:

答案 0 :(得分:2)

只需将'魔术'功能放入通话功能:

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"

答案 1 :(得分:0)

据我所知,无法伸出手并从javascript函数中获取任意变量。来自对象yes,但不是来自执行方法。

我想不出任何可以帮助你的函数方法(应用,调用,否则):坦率地说,我认为你正在努力获得比普通string.format,er ...格式更大的边际收益。

答案 2 :(得分:0)

@sebasgo是正确的,你无法完全按照自己的意愿去做。但我想你可能希望看到Prototype的String.interpolate方法:

"#{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>