0

私は動的検証システムに取り組んでいます。何らかの理由で、mainfunc が validateNumber に渡す args 配列に対する shift() が正しく動作しません。アラート ボックスの横のコメントに出力を含むコードを次に示します。

function mainfunc (func){
    //this calls the function validateNumber and passes args to it.
    this[func].apply(this, Array.prototype.slice.call(arguments, 1));
}

function validateNumber(args) {
    alert(args); //this functions normally. for example, displays fish,3,5
    var text = args.shift; //would expect this to return 'fish', right?
    alert(text); //instead of 'fish' alerts 'function shift() { [native code] }'. This is the problem.
    var minimum = args.shift;
    var maximum = args.shift;
    return text;
}

validationArgs = classList[i].split('-');
    functionName = validationArgs.shift();
    validationArgs.unshift($(this).val());
    mainfunc(functionName, validationArgs); //calls mainfunc which calls the function

なぜこれがこのように振る舞うのか、私は困惑しています。注: この StackOverflow の回答から mainfunc を引用しました: Calling dynamic function with dynamic parameters in Javascript

編集:ああ、私の良さ。私はばかです。質問のタイトルでも shift() を正しく使用しています! 皆さんありがとう。

4

4 に答える 4

2

これ:

var text = args.shift;

はメソッド呼び出しではありません。

var text = args.shift();

shift元の操作はメソッド fromargsを に割り当てるだけなので、次のようtextになります。

function shift() { [native code] }

で出力しますalert。を実行しても、次の 2 つには何args.shiftの影響もありません。args

var minimum = args.shift;
var maximum = args.shift;

args.shiftまったく変更せずに、さらに2つの参照を提供してくださいargs

于 2011-08-10T05:05:10.587 に答える
2
var text = args.shift; //would expect this to return 'fish', right?

違う。関数を呼び出すには括弧が必要です。それ以外の場合は、関数自体を取得するだけです (警告メッセージで見たもの)。

var text = args.shift();
于 2011-08-10T05:05:17.077 に答える
1
var text = args.shift; //would expect this to return 'fish', right?

shiftはメソッドです。それを呼び出すか、参照を割り当てるつもりでしたか?

于 2011-08-10T05:05:15.510 に答える
0

ここで何が起こっていたかの説明を完了するために:

var p = args.shift;

メソッドの割り当てです。shiftオブジェクトで見つかった関数argsを変数に割り当てましたpが、実際にはその関数を実行していません。この時点でp、関数 shift への参照が含まれています。したがって、 するとalert(p)、ネイティブ コード参照が表示されます (これは、シフト関数の背後にあるコードです)。

一方:

var p = args.shift();

shiftオブジェクトで指定された関数を見つけ、argsパラメータなしで実行し、そのメソッドの戻り値を変数に割り当てますp

于 2011-08-10T06:15:45.593 に答える