0

関数に渡す変数への参照として文字列を使用しようとしています。例えば:

var names = ['Peter', 'John'],

var hasName = function(name){
    var params = ['names'];
    return $.inArray(name, eval( params[0] )) === -1;
};

回避する方法はeval()

編集:

からの文字列は、HTMLのparams[0]から来ています。実際のデータを含む配列はどこでも宣言できます。これは、 で文字列として渡されたその配列への単なる参照であり、パラメーターです。ここにプラグインのコードを貼り付けました。data-qvalinputparams[0]data-qval

http://pastebin.mozilla.org/1598528101.

完全な例: http://jsfiddle.net/elclanrs/ZsS2D/29/

それは現在動作しています、私はただ取り除く方法を探していeval()ます...

4

4 に答える 4

3

その特定のケースでは、次を使用してnamesください:

var names = ['Peter', 'John'],
var hasName = function(name){
    var params = ['names'];
    return $.inArray(name, names ) === -1;
};

(以下の注も参照してください。) (あなたの編集により、上記は適用されなくなります。)

namesstring を使用してコンテナー内の配列を検索しようとしている場合は"names"、コンテナーへの参照が必要です。たとえば、次のようになります。

var obj = {
    names: ['Peter', 'John'
};
var hasName = function(name){
    var params = ['names'];
    return $.inArray(name, obj[params[0]] ) === -1;
};

これを行っている変数スコープ以外にコンテナーない場合は、 を使用する必要がありますeval。しかし、(上記のように) コンテナーを用意して、それを回避できるように調整することができます (通常は調整する必要があります)。namesがグローバル スコープで宣言されている場合は、コンテナー ( ) があることに注意してくださいwindow

要約すると:

  1. がグローバル スコープ (または暗黙的なグローバル) の場合names、それへの参照が提供されます。varwindow[params[0]]

  2. namesがすでにコンテナ オブジェクト内にある場合はcontainer[params[0]]、それへの参照を取得するために使用できます。

  3. namesvar関数内にある場合、実行時文字列を使用してeval;なしで取得することはできません。理想的には ではなくvar names = [...];を使用var container = {names: [...]};してから を使用できますcontainer[params[0]]


関数は呼び出されますが、配列に名前がないhasName場合とある場合に戻ります。あなたはおそらく、そうではありません。truefalse!== -1=== -1

于 2012-04-26T07:34:07.110 に答える
3

これで十分ではありませんか?

var hasName = function(name){
    return $.inArray(name, names) > -1;
};

また、比較に注意してください

JavaScript は 0 を大まかに false と同等 (つまり 0 == false ですが、0 !== false) として扱うため、配列内の値の存在を確認する場合は、それが等しくない (またはより大きい) かどうかを確認する必要があります。 ) -1.

于 2012-04-26T07:34:45.133 に答える
0

変数への参照としての文字列? ブラウザのグローバル オブジェクトの場合は、window オブジェクトに含まwindow[variableName]れるため、その値を取得するだけで済みます。オブジェクトについても同じです。つまり、 の代わりにまたはobject.fooを実行できます。ローカル スコープの変数の場合、オブジェクトまたは.object['foo']bar = 'foo', object[bar]eval

于 2012-04-26T08:02:11.487 に答える
0

namesがグローバルの場合、グローバル名前空間を使用できます。つまり、window

var hasName = function(name,namespace){
    namespace = namespace || window;
    return $.inArray(name, namespace.names) > -1;
};
hasName('Peter'); //=> true;

これもアイデアかもしれません:

var MYNS = { names:['Peter','John']
            ,hasName: function(name){
               return $.inArray(name, this.names) > -1;
             }
           };
 MYNS.hasName('Peter'); //=>true
于 2012-04-26T08:23:00.283 に答える