JavaScriptでは、ローカル変数は私が認識しているオブジェクトには存在しません。それは最後のオプションeval('x')
は名前でこれらの変数を参照することが可能であることを示し、名前パターンによるローカルjavascript変数の検索
function foo() {
const x = 2;
self.x; // undefined
this.x; // undefined
window.x; // undefined
x; // 2, obviously
eval('x'); // 2
}
です。これはオブジェクトの上に住んでいた場合、私はmyObject[Object.keys(myObject).find((key) => key.startsWith('foobar_'))]
のようなものを使用することになり
function foo() {
// Code not under my direct control
function foobar_abc() {}
function other_functions() {}
// Code under my control
const matchingFunction = // find the function with name matching 'foobar_*'
}
:私はこれを拡張し、名前パターンを使用して変数にアクセスしていますよ。グローバルスコープの場合、myObject
はwindow
となり、すべて動作します。
eval
が名前で変数にアクセスできるという事実は、値がどこかで利用可能であることを意味します。この変数を見つける方法はありますか?あるいは、私が直接コントロールしていない(潜在的に非常に複雑な)コードを書き直すテクニックに頼らなければならないのですか?
私は近代的なブラウザをターゲットにしています。この使用例では、eval
または同様のハックの解決策を使用しても構いません。ユーザー提供のコードの実行が目的であるため、任意のコードは既に実行されています。
普通のブラウザの場合は、おそらく 'window [X]'が必要でしょう。 'this.hasOwnProperty(X)'はどうでしょうか? 'this'オブジェクトはあなたに現在のスコープを与えます。基本的には 'for(これで名前をつけてください){...}'を実行できるはずです – Dekel
これはhttps://stackoverflow.com/questions/2051678/getting-all-variables-in-scopeの複製であるようです –
@Dekelこれはローカルスコープの変数なので、 'window'でも' this'でもありません。それはどこかのオブジェクトに存在するかもしれませんが、まだ私はそれについて聞いていません! – Dave