2011-08-10 3 views
0

私は、動的検証システムに取り組んでいます。何らかの理由で、args配列mainfuncのshift()がvalidateNumberに渡って正しく動作しません。警告ボックスの隣にあるコメントに出力されるコードは次のとおりです。はなぜシフト())(適用使用して動的に呼び出された関数からの私の引数に不正に取り組んでいますか?

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をcribbed:Calling dynamic function with dynamic parameters in Javascript

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

答えて

2

この:

var text = args.shift; 

はあなたが欲しい、メソッド呼び出しではありません。

var text = args.shift(); 

すべてのあなたの原稿がありませんされ、あなたのため、argsからtextshift方法を割り当てます。

function shift() { [native code] } 

あなたalertで出力。 args.shiftを行うことはので、これら2 args上の任意の効果がありません。

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

だけで、すべての argsを変更することなく、次の2つ以上の基準の args.shiftにを与えます。

1
var text = args.shift; //would expect this to return 'fish', right? 

シフトがメソッドである、あなたはそれを呼び出すか、参照を割り当てることを意味するのですか?

2
var text = args.shift; //would expect this to return 'fish', right? 

間違っています。あなたは機能を呼び出すために括弧が必要です。それ以外の場合は、警告メッセージで見た関数自体を取得します。

var text = args.shift(); 
0

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

var p = args.shift; 

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

var p = args.shift(); 

関数はargsオブジェクト上shiftと命名し、パラメータを指定せずにそれを実行し、変数pにそのメソッドの戻り値を割り当て見出します。

関連する問題