我有一个像
这样的功能function a (p1, p2) { /* ... */ }
并且在某些范围内想要得到这样的东西:
function b (/* no params! */) { return a (my1, my2) }
其中my1和my2在此范围内以某种方式定义。所以我应该得到一个无参数函数b,当调用时调用带有固定参数my1和my2的函数。现在,问题是,为什么这不对,哪个是:)
UPD:好的,我在这些参数中有一些回调,现在发现了,如何处理它们。我错过的是两次应用该技术。谢谢。答案 0 :(得分:17)
只需创建一个返回新函数b的函数:
function getB(my1, my2) {
return function() {
a(my1, my2);
}
}
并像这样使用它:
var b = getB(my1, my2);
答案 1 :(得分:2)
编写一个带my1和my2的函数并创建函数b:
function make_b(my1, my2){
return function b(){ return a(my1, my2);};
}
答案 2 :(得分:1)
为什么这不对?你收到错误了吗?我尝试根据你的描述和我的工作重现一个工作样本,所以也许你可以发布一个更详细的样本:
<script>
function a(p1, p2)
{
return 'hello ' + p1 + ' and ' + p2;
}
function b(my1,my2)
{
return function()
{
return a(my1,my2);
}
}
var wrapper=b();
alert(wrapper());
</script>
根据你对另一个答案的评论,我更新了我的样本,以展示你如何包装一个函数。
好的,所以我用变量替换了它们; - )
答案 3 :(得分:1)
我不确定我是否理解正确,但你可以看一个名为currying的概念。可以在Javascript中调整函数,以便您可以获得具有预设的部分或全部参数的其他函数。
您可以查看实施here。
如果您使用的是原型,则可以通过这种方式获得功能。
var b = a.curry(arg1, arg2);
现在调用b()
与调用a(arg1, arg2)
答案 4 :(得分:0)
将值放在数组(或JSON)中并返回数组。
function a (p1,p2) {
var my = []
my[0] = p1
my[1] = p2
return my
}
function b () {
return a(my1,nmy2)
}
也许我错过了你的例子中的观点,我不知道。
答案 5 :(得分:0)
似乎有三个部分:
定义:
function a(M, N) {
return M + N;
}
定义b:
var X = 10;
var Y = 25;
var b = function() {
return a(X, Y);
}
使用b:
var thirtyFive = b(); // thirtyFive = 35
答案 6 :(得分:0)
此示例使用onclick事件处理程序的分配 在页面加载期间演示如何创建函数 包含嵌入式引用然后本地的引用 设置功能中的值。
<html>
<head>
<title>Scope passing Test</title>
<script type="text/javascript">
// Your target function
function a(p1,p2) { alert("p1="+p1+ " p2="+p2); }
function yourSetupFunction()
{
// Declare some local variables that your "a()" function cannot see to test.
var my1 ="Look Ma" ;
var my2 ="No hands" ;
// Snag a reference to the <a id="testA"></a> element
var oAelement=document.getElementById("testA");
oAelement.addEventListener( "click" ,
(function(scopePass_My1,scopePass_My2)
{
return function()
{
a(scopePass_My1,scopePass_My2)
}
})(my1,my2) ,true);
}
</script>
</head>
<body onload="yourSetupFunction()">
<a id="testA" href="#" onclick="return false;">Click to Test</a>
</body>
</html>
实际的魔法就是几行
(function(scopePass_My1,scopePass_My2)
{
return function()
{
a(scopePass_My1,scopePass_My2)
}
})(my1,my2)
第一组parens导致内容被评估为函数引用。
第二组parens ...(my1,my2)...导致调用函数引用 返回另一个函数引用,可以看到传入的参数 ... scopePass_My1,scopePass_My2 ...并且能够将这些传递给你的目标函数a(p1,p2)
希望有所帮助。