包含功能

时间:2017-07-09 01:33:04

标签: javascript function object

所以,我正在使用函数构造函数生成函数的库。

每个生成的函数都有一个属性附加到称为default的函数,用于选项参数的商店默认值。

像这样:

var generated_function = function( arg1, arg2, options_arg ){ ... }
generated_function.default = {}

将默认值作为函数的属性附加而不是将其存储在函数中的原因如下:

var generated_function = function( arg1, arg2, options_arg ){
  default = {}
}

是我希望选项在运行时根据需要更改默认设置。

一个示例用法是说你的默认选项是一个巨大的对象,由100个或1000个属性组成,你的议论选项平均只有默认值的25%。

我们也说你在100或1000次调用此函数,并且每次调用都会更改参数选项,但只更改默认选项,最多只能调用2次。

现在我可以将默认选项与该参数中的参数选项一起传递,但这需要创建并将大量非常大的对象传递给生成的函数。这是一个记忆问题。

我无法承受此脚本的内存问题。请记住,该函数已生成,这意味着我还面临将该大小和频率的所有数据传递给不是一个而是多个函数的问题

我需要的是能够访问附加属性,但我不能这样做:

var generated_function = function( arg1, arg2, options_arg ){ 
  ...
  generated_function.default ... //do something with it
  ...
}
generated_function.default = {}

因为函数的名称是自动生成的,这意味着很难像我一样按名称访问函数,并且该函数可以在另一个生成的函数内生成,这意味着我必须处理范围问题。

所以,基本上我正在寻找的是:

var generated_function = function( arg1, arg2, options_arg ){ 
  ...
  containing_function.default ... //do something with it
  ...
}
generated_function.default = {}

所以我可以在这个生成的场景中使用它:

( window[ somerandomlygeneratedstring ] = function( arg1, arg2, options_arg ){ 
  ...
  containing_function.default ... //do something with it
  ...
  ( someobjectthatcannotbetracked[ somerandomlygeneratedstring ] = function( arg1, arg2, options_arg ){
    ...
    containing_function.default ...
    ...
  } ).default = { ... }

} ).default = { ... }

2 个答案:

答案 0 :(得分:3)

您可以使用arguments.callee访问当前功能。这里

var generated_function = function( arg1, arg2, options_arg ){ 
  ...
  arguments.callee.default ... //do something with it
  ...
}
generated_function.default = {}

答案 1 :(得分:0)

函数表达式可以有一个只在函数中可用的可选名称,所以:

var generated_function = function whatever( arg1, arg2, options_arg ){ 
  ...
  whatever.default ... //do something with it
  ...
}

所有生成的函数都具有相同的名称并不重要。

在IE版本中有named function expressions存在一些问题,包括版本8,但如果选择的名称恰当,则在这种情况下它们不是问题。

E.g。

var fn0 = function foo(){
  console.log(foo.props.bar);
}
fn0.props = {bar:'f0 old bar'};

var fn1 = function foo(){
  console.log(foo.props.bar);
}
fn1.props = {bar:'f1 old bar'};

// Call fn0, change props, call again
fn0();
fn0.props.name = 'f0 new bar';
fn0();


// Call fn1, change props, call again
fn1();
fn1.props.name = 'f1 new bar';
fn1();

以上显示对多个函数表达式使用相同的名称很好,因为该名称仅在函数中可用。它实际上与:

相同
var fn0 = function () {
  var foo = arguments.callee;
}

除了它在严格模式下是安全的。