Javascript 使用function.apply传递闭包
考虑一个带有参数的函数:Javascript 使用function.apply传递闭包,javascript,Javascript,考虑一个带有参数的函数: function add1(a, b) { return a + b; } 我们可以使用例如add1.apply(窗口[1,2])调用add1,并获得结果3 考虑使用此的函数: function add2() { return this.a + this.b; } 我们可以使用add2.apply({a:1,b:2},null)调用add2,并获得结果3 考虑一个(不太好的)函数: function add3() { return a + b; } 我们是否可
function add1(a, b) { return a + b; }
我们可以使用例如add1.apply(窗口[1,2])
调用add1
,并获得结果3
考虑使用此的函数:
function add2() { return this.a + this.b; }
我们可以使用add2.apply({a:1,b:2},null)
调用add2
,并获得结果3
考虑一个(不太好的)函数:
function add3() { return a + b; }
我们是否可以调用此函数并传递包含a
和b
值的闭包?
请注意,在全局范围内创建
a
和b
不是一个可接受的解决方案(例如window.a=1;window.b=2;add3();
)我认为将参数声明为a和b的想法是在函数体中已经设置了这些变量。所以你不需要这么做
function add_ab() {
var a = arguments[0];
var b = arguments[1];
return a + b;
}
或以Perl风格完成:
function add_ab() {
var args = Array.slice(arguments);
var a = args.shift();
var b = args.shift();
return a + b;
}
通常,如果不知道参数的数目,可以只传递一个array类型的参数,这样就可以在数组中添加所有的数字 来吧,伙计们。Javascript是一种动态语言,所以几乎任何事情都有可能:
function add3() { return a + b; }
(function notGlobalScope() {
var a = 1;
var b = 2;
var funcBody = "var a="+ a +", b="+ b +";\n"+
add3.toString() +"\n"+
"add3()";
console.log(eval(funcBody));
})()
你能举个例子说明你希望如何调用函数
add3
“传递闭包”吗?这不是你的意思。A是一个有其环境的函数,如add3
(它结束于A
和b
)@AmitJoki我正在使用coffeescript中的一些概念对类型注释进行一些实验,所以用例非常特殊。@Bergi感谢为我澄清这一点!:)是的,您可以编写putInNewScope
函数(只要支持toString
),但无法将值传递给原始函数中的自由变量。是的,但由于函数本身没有更改,因此它是原始函数还是副本并不重要。因此,我想说这个问题的答案是肯定的,因为他将函数称为代码,而不是函数的特定运行时实例。好吧,如果原始函数实际上是一个闭包(在它的一些自由变量上),它将产生不同:-)再次为真,但是这个问题的答案仍然是肯定的,复制函数是可能的:)