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
),但无法将值传递给原始函数中的自由变量。是的,但由于函数本身没有更改,因此它是原始函数还是副本并不重要。因此,我想说这个问题的答案是肯定的,因为他将函数称为代码,而不是函数的特定运行时实例。好吧,如果原始函数实际上是一个闭包(在它的一些自由变量上),它将产生不同:-)再次为真,但是这个问题的答案仍然是肯定的,复制函数是可能的:)