簡體   English   中英

訪問包含功能

[英]Access containing function

所以,我正在開發一個使用函數構造函數生成函數的庫。

每個生成的功能是將具有附接到被稱為功能的屬性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 = { ... }

您可以使用arguments.callee訪問當前函數。 這里

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

函數表達式可以具有僅在函數中可用的可選名稱,因此:

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

所有生成的函數都具有相同的名稱並不重要。

IE中的命名函數表達式存在一些問題,包括版本8,但在這種情況下,如果正確選擇名稱,它們不是問題。

例如

 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;
}

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM