1
  1. validateという名前の関数でcontという名前のローカル変数を宣言しました。
  2. 私はvalidateの内部から関数プロセスを呼び出しています。
  3. 関数を検証するための引数として文字列'cont'を送信しています。
  4. 文字列'cont'を使用するプロセス関数で、window['cont']のようなjavascriptローカル変数の値にアクセスしたいと思います。しかし、私は未定義になります。
  5. 私がやろうとしているのは、phpや$$の$GLOBALSのような変数にアクセスしようとしていることです。

これが私がしたことの例です。

<script>

function process(str)
{
   alert(window[str]);
}

function validate()
{
   var cont='once there lived a king named midas';
   process('cont')
}

validate();

</script>

その理由は、ほとんどのフォームをajaxとして実行するためです。私はこのようなリクエスト文字列を作りたくありません。

var param = "command=insert&content=" + encodeURIComponent(cont);

こんな風にやりたいです。

var param = makeParam('command,[insert],content,(cont)');

makeparamで行うことは、正規表現を使用してキーと値のペアを抽出することです。したがって、(cont)から文字列contを取得し、それをwindow[cont]のようなウィンドウ変数に置き換えます。contには文字列'cont'があります。

では、変数の名前を文字列として使用して、変数の内容を取得するにはどうすればよいでしょうか。

だから私はphpの$$に相当するjavascriptを探しています

編集済み

(cont)内にあるcontを抽出するコードの一部。これは、()の間の文字列の内容が必要であることを意味します。

nxt = str[i+1].match(/\((.*)\)$/)

if(nxt)param += '=' + encodeURIComponent(window[nxt[1]]);

paramの内容は次のようになります

"command=insert&content=once there lived a king"
// assume that once there lived a king is encoded

編集。注2。

さらにいくつかの応答の後、これを追加するためにコードを編集しています。

私はphpで$GLOBALSのようにしようとしています。

$GLOBALSがローカル変数も保持できるかどうかは試していません。

そして、ローカルスコープが$GLOBALSに入らないことを学びました。


FelixKingのアップデートを読んだ後にアップデートしてください。

クエリ文字列をできるだけ単純に作成する関数を使用したいと思います。次のように。

var param = makeParam('command,insert,/title/,/keywords/,/description/,mode,[1],fckcontent,(cont)');

// if it is a text without // or () then the it is a straight key value pair. so i will do comment=insert.

//if it is /title/ then the key is title and its value is an input elements value with id as title so title=getElementById('title')

//if it is mode,[1] then mode is the key and 1 is its direct value//

//if it is fckcontent,(cont) then fckcontent is the key and cont is a javascript local variable which will contain html content from a WYSIWYG editor.

// a sample result will be

 var param = "command=insert&keywords=somekeywords&description=somedescription&mode=1&fckcontent=<p>once there lived a king<p>

そしてcasablancaは、$GlOBALSにはローカルスコープ変数が含まれないと述べました。これはjavascriptでも同じです。それは正しい。

4

5 に答える 5

2

http://www.i-marco.nl/weblog/archive/2007/06/14/variable_variables_in_javascri-それがあなたを助けるかもしれない、または

https://stackoverflow.com/questions/592630/javascript-variable-variables

于 2010-10-21T11:51:18.083 に答える
2

他の人が示唆しているように、コードの他の場所でローカルスコープの変数にアクセスすることはできません。

最初に投稿したコードは次のとおりです。

function process(str) {
    alert(window[str]); // This will alert 'once there lived a king named midas'
} 

function validate() {
    var cont = 'once there lived a king named midas';
    process('cont'); 
}

validate();

別のオプション(すべてを「ウィンドウ」変数マップに配置するのではなく)は、独自のマップを作成することです。

したがって、コードは次のようになります。

var variables = { }

function process(str) {
    alert(variables[str]); // This will alert 'once there lived a king named midas'
}

function validate() {
    variables['cont'] = 'once there lived a king named midas';
    process('cont');
}

validate();

これは、文字列を使用して追加およびインデックス付けできるグローバルマップを作成することだけです。

于 2010-10-22T07:07:25.883 に答える
2

あなたのコードは正しいですが、あなたが期待していることは間違っています。$GLOBALSPHPにはローカル変数が含まれておらずwindow、JavaScriptにも同じことが当てはまります。contはローカルvalidateであるため、からアクセスすることはできませんprocess

PHPでは、関数内で変数をグローバルとして明示的に宣言する必要があります。JavaScriptでは、逆に機能します。を使用して宣言された変数はvarすべてローカルであり、宣言されていない変数はすべてグローバルです。

于 2010-10-22T05:13:46.423 に答える
1
function validate()
{
   var cont='once there lived a king named midas';
   process('cont')
}

contグローバルスコープではなく、関数のローカルスコープで定義されます。どちらか

cont='once there lived a king named midas';

(なしvar)または

window.cont='once there lived a king named midas';

アップデート:

しかし、なぜ文字列の解析でそれほど多くの問題を経験したいのですか?やってみませんか:

var param = makeParam({command: 'insert', content: encodeURIComponent(cont)});
于 2010-10-21T11:56:37.207 に答える
0

cont変数を文字列として渡す必要がある理由と、オブジェクトを介してアクセスする理由を理解しようとしていwindowます。これにより、コードで期待したようになります。

process = function (str) {
    alert(str); // This will alert 'once there lived a king named midas'
}

validate = function () {
    var cont = 'once there lived a king named midas';
    process(cont);
}

validate();

参考までに:グローバル変数を宣言することは一般的に悪い習慣と考えられています。特に、このようにグローバル変数を必要としない場合はそうです。(しかし、私たちは間違っている可能性があります。あなたが何を達成しようとしているのか完全にはわかりません)

編集:eval() -esque変数参照をいじくり回すのではなく、いくつかの関数を使用していくつかの変数を渡すことをお勧めします。たとえば、次makeParamのように実装できます。

var cont = 'Boggis, Bunce, and Bean.',
    makeParam = function(str) {
        var param = '',
            i = 0,
            arg = str.split(','),
            l = arg.length;
        while (i < l) {
            if (arg[i + 1].match(/\([a-zA-Z]+\)/)) { // No reason to capture
                param += [arg[1], cont].join('=');
                i += 2;
            } else if (arg[i].match(/\/[a-zA-Z]+\//)) { // No reason to capture
                param += [
                    arg[i], 
                    document.getElementById(arg[i]).value
                ].join('=');
                i += 1;
            } else {
                param += [arg[i], arg[i + 1]].join('=');
                i += 2;
            }
            param += (i + 1 === l) ? '' : '&';
        }
        return param;
    };
param = makeParam('command,insert,/title/,/keywords/,/description/,mode,[1],fckcontent, (cont)');
param === 'command=insert&\
         keywords=somekeywords&\
         description=somedescription&\
         mode=1&\
         fckcontent=Boggis, Bunce, and Bean.';

しかし、おそらく関数contに渡したいと思うでしょう。makeParam

于 2010-10-21T13:53:00.373 に答える