gpt4 book ai didi

Javascript:始终在执行上下文中执行函数

转载 作者:行者123 更新时间:2023-11-28 20:05:37 25 4
gpt4 key购买 nike

我编写了这个快速模板函数:

var templatize = function(string) {
return function (string) {
return string.replace(/{{(.*?)}}/g, function(pattern, match) {
value = this[match];
if (value) {
return value;
} else {
return pattern;
}
});
}.call(this, string);
}

这是做什么的:

var foo = "bar", bar = "foo";
templatize("We are {{foo}} and {{bar}}, but not {{crazy}}"); // "We are bar and foo but not {{crazy}}"

我对此非常满意,只是我遇到了范围界定问题。当然,可以通过namedscope访问templatize方法,但是,在我的函数中无法自动访问templatize的当前执行上下文。

类似调用 $.proxy(templatize, this)("We are {{foo}} and {{bar}}, but not {{crazy}}") 应该可以,对吧?

但我想实现这一点,而不需要调用 $.proxy() (最好没有任何 jQuery),以便上下文自动转移到执行者。

我正在努力解决 .call().apply() 和其他闭包,但我想我在互联网上的某个地方读到这是可能的。谢谢

最佳答案

您可以避免使用 jQuery 这样做:

var templatize = function(string) {
var me = this; // the data source
return string.replace(/{{(.*?)}}/g, function (full, key) {
// "this" refers to the string itself
return me[key] || full;
});
}

如果您想使用jQuery.proxy(),请包装替换函数:

var templatize = function(string) {
return string.replace(/{{(.*?)}}/g, jQuery.proxy(function (full, key) {
// "this" now refers permanently to the data source
return this[key] || full;
}, this));
}

在这两种情况下,您都可以使用 call 将数据源绑定(bind)到 this :

templatize.call({ hello: 'Hi!' }, '{{hello}}');
<小时/>

更进一步

您可以通过编译模板进行优化以供重用:

function compile(tpl) {
var i = -1, tmp = [];
tpl = tpl.split(/{{([^{}]+)}}/);
while (++i < tpl.length) {
if (i % 2) tmp.push('this["' + tpl[i] + '"]');
else if (tpl[i]) tmp.push('"' + tpl[i].replace(/"/g, '\\"') + '"');
}
return new Function(
'return [' + tmp.join() + '].join("");'
);
}

使用示例:

var tpl = compile('{{hello}} {{hello}}');
tpl.call({ hello: 'Hi!' }); // "Hi! Hi!"
tpl.call({ hello: 'Yo!' }); // "Yo! Yo!"

对于上面的示例,这是 compile 返回的函数:

function () {
return [this["hello"]," ",this["hello"]].join("");
}

请注意,您也可以使用数组:

var tpl = compile('{{1}} {{0}}');
tpl.call(['a', 'b']); // "b a"

性能测试:http://jsperf.com/template-compiling .

关于Javascript:始终在执行上下文中执行函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20885411/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com