2009-07-20 7 views
22

は、私はちょうど、エラーの原因となった私は表面的には、知っているJavascript + Firebug:「最適化クロージャにアクセスできない」とはどういう意味ですか?

cannot access optimized closure 

、(Firebugのランニングと、Firefox 3.5の中で)のjavascriptの部分で、次のエラーを得ました。私は、メッセージが離れて行かせた、このバグを修正

options.length() 

代わり

options.length 

のラインを持っていました。しかし、私は興味があります。これは何を意味するのでしょうか?最適化クロージャとは何ですか?エンクロージャーを最適化して、javascriptインタプリタが自動的に行うことはありますか?それは何をするためのものか?

+1

「オプション」とは何ですか?配列? – rodrigoap

+2

5日前のmozilla.dev.platform'に関する議論(07/15):http://groups.google.com/group/mozilla.dev.platform/browse_thread/thread/1f963989e7af0900 - 残念ながら、多くの答えは、私はクロスリンクしているだけです。 – Tomalak

答えて

1

は、Firefoxのバグのように思える: https://bugzilla.mozilla.org/show_bug.cgi?id=496790

+2

Firefoxでこのメッセージが表示されていますが、Chromeはコード内の同じポイントで停止します。 – Killroy

+0

そのバグはFx 3.0と3.5の間のナイトリズにのみ影響していたので、ここにいる誰もがそれを見るのは疑いありません。 – Nickolay

1

閉鎖は、コンテキストを持つ関数です。新しい関数を動的に作成する場合は、クロージャを作成します。ここで

function makeAdder(int num) { 
    return function(int num2) { return num + num2; } 
} 

adder = makeAdder(5); 
adder(7) // returns (5+7) = 12 
adder(2) // returns (5+2) = 7 

可決された「5」とともに、makeAdderによって返される、クロージャは、内側の関数です。

javascriptエンジンは、デバッグや参照ができないように、コードを生成したり実行したりすることはありません。オプティマイザは、影響がないことを確認するために非常に注意することになっているので、私は間違いを犯したと思います。

+1

おそらく、 'return function(){...}'ではなく、 'return new function(){...}'ではありませんでした。後者は実際にはコンストラクタとして関数を使って新しいオブジェクトをインスタンス化します。また、関数をクロージャを作成するために「動的に」作成する必要はありません。関数式や関数宣言は、スコープチェーン内のフリー変数を閉じます(スコープチェーン内にグローバルスコープのみを含むように設定された 'Function'によって作成された関数を除く)。 – kangax

4

Firebugの実行中にこの問題が発生しました。

何らかの理由で例外が発生したときや、呼び出しスタックのどこかに再帰的な関数呼び出しがあるときに、時々起こるようです。不思議な "InternalError:最適化されたクロージャーにアクセスできない"のように例外が再発生します。

再帰関数を定義する方法を変更すると、この問題は解決しないようです。例えば役立ちます希望は

var foo = function(bar) {... foo(recursively); ...} 

function foo(bar) {... foo(recursively); ...} 

から変更します。

+1

私は再帰関数でこの問題を抱えていました。ありがとう! – Skilldrick

+2

乾杯。関数が再帰的に呼び出されるかどうかは違いをもたらさないかどうかが判明したので、問題を引き起こした別の関数の中に入れ子にして宣言していました。 –

+1

これも私のために修正されました。再帰関数でもありませんでした。 –

0

今日も同じエラーが発生しました。私の場合、これは、存在しなかったか、利用できなかったオブジェクトの属性または関数を参照していたために発生しました。私は、オブジェクトが最適化されたクロージャを介して利用可能であったため、ファンクバグはそのオブジェクト上のメタデータにアクセスできず、したがって謎めいたエラーメッセージになると推測しています。

3

それはFirebugのが、オープンで起こっFirefoxのバグがある:

https://bugzilla.mozilla.org/show_bug.cgi?id=505001

[以前の答えは、これは私は他の問題はFirebugのに関連していなかったとして、間違っていると思うthis other bug、によるものであった言及しました。 ]

+0

このバグについてのコメントは、これがFirefox 3.6で修正されたことを示しているようです。わーい!誰かが3.6でこれを見るなら、火かき棒のニュースグループにこれを持ち込んでください。 – Nickolay

0

これも今日私に起こりました。この関数の2行目でerror'd Firebugのは:私は、1行目の「再」の宣言の前に「VAR」を追加すると

 
function IsValidDate(objName) { 
    re = new RegExp('^(+|today|pdate|- *\\d+ *(day(s|)|week(s|))+ *$', 'i'); 
    if (re.test(objName.value)) return 2; 
    return (chkdate(objName)); 
} 

、エラーが去っていきました。

0

このエラーが発生した関数内のコードの中でどこかに提起されている例外があります。それは、存在しない変数にアクセスするのと同じくらい単純なことかもしれません。

エラーをプロンプトするために例外を発生させたクロージャのどこがより具体的なエラーを出さないのかについては、Firebugデベロッパーに問い合わせる必要があると思います。

options.length()を貼り付けましたが、エラーのプロンプトではありません。このエラーの原因は、あなたのバグが閉鎖の中にあったことです。エラー

1

これを与える

function(){ 
    array.length() 
} 

も、単純な競合状態によって引き起こされる場合があります。私は、ドキュメントが準備される前にいくつかのことを行う「スタートアップ」オブジェクトをリファクタリングしていました。起動オブジェクトのすぐ下に定義された2番目のオブジェクトにアクセスしようとすると、私はこのエラーを受け取りました。

私は、スクリプトの実行がすべてのコードがコンパイルされるまで待っていました。明らかにそれはそうではありません。 2番目のオブジェクトのメソッドを呼び出す準備ができているドキュメントを待つことで、問題が解決されました。また、この素晴らしい 'dump()'関数を使用すると、エラーが発生したときに2番目のオブジェクトが部分的にのみ定義されていることが確認されます。http://www.openjs.com/scripts/others/dump_function_php_print_r.php

関連する問題