我正在尝试定义一个函数,该函数可以访问调用它的函数范围内的变量。
(我正在尝试构建一个比“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”。
目前我可以通过对函数返回代码进行评估来实现这一点,但似乎必须有更好的方法。
答案 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>