0

UglifyJSパーサーを使用して、定義が保証されていないときにコード内の識別子が使用されているかどうかを確認したいと思います。

例:

// Should raise an error since myfunc and myvar have not been defined, but works
var ast = jsp.parse('myfunc(myvar);');

(スコープ内に存在する可能性があるため)必ずしもmyfunc未定義でmyvarはないことを認識していますが、いつ未定義になる可能性があるかを知りたいと思います。

echo "myfunc(myvar);" | uglifyjs幸いにも戻ってきmyfunc(myvar);て、未定義の変数をチェックするオプションが見つかりません。

JSLintを実行してassume browser, window, node.js, etc すべてオフにすると、これが私が求めている結果です。UglifyJSでも同様のことをしたいと思いますが、環境については何も想定していません(ウィンドウ、コンソール、アラートなどはありません)。

4

2 に答える 2

0

文字列リテラルの特定の内容が有効なコードを構成するかどうかを判断することを期待しているため、かなり難しい順序になっています。文字列リテラルは、ほとんど文字通り(hehe)何でもかまいません。もちろん(「簡単」とはまったく異なる概念です)、ある仕様に従って文字列リテラルが有効であると予想される正確な状況を指定することは可能ですが、それを行うための支援が必要な場合は、次のことを行う必要があります。そのようなリテラルを識別できるアルゴリズムをすでに持っていることを示してください。

まず、そのような状況を特定し、次に、そのようなリテラルコンテンツが従わなければならない一連のルール(正式な文法がこれを行うための良い方法です)を述べる必要があります(すべてではありませんが、一部の状況では、そのような文法を正規表現で表現できるかもしれません)。

于 2012-09-20T09:13:43.687 に答える
0

「スコープチェーン」を使用できます。可変スコープについては、この記事http://tore.darell.no/pages/scope_in_javascriptで説明されています。

Scope チェーンを使用するのは簡単かもしれませんし、そうでないかもしれません...

これは記事の良い例です

//global
function foo () {
  //global.foo
  function bar () {
    //global.foo.bar
    function baz () {
      //global.foo.bar.baz
    }
  }
}

関数や変数がこのスコープチェーンで定義されているか、スコープチェーンの特定のレベルまで定義されているかを確認できます。(たとえば、global.foo.bar 内のすべてが問題ありません)。

たぶん、これがあなたの問題を解決する方法です。

于 2012-09-20T09:23:29.210 に答える