0

次のような小さなスクリプトがあります。

hideElements = arguments.shift().split ( ',' );
for ( iterator in hideElements ) { 
    console.log ('  --> hiding ' + hideElements[iterator] );
    lg_transitions ( {kind:"slide-up"} , { target : hideElements[iterator] } );
}

デバッガーで実行すると、すべてが非常に合理的に開始されます。上記の最初の行にブレークポイントを設定しました。「次の関数呼び出しのステップオーバー」ボタンを押した後、「hideElements」変数を次のように初期化します。

ここに画像の説明を入力してください

これは私が期待していたことですが、最初の(そして唯一の)反復を完了すると、ループの先頭に戻り、0から始まった「イテレータ」が奇妙なことに「削除」に変わりました。 。は?それがどこから来たのか分かりません。しかし、それに続くconsole.logメッセージには、ヒントがあるかもしれません...それはコンソールに以下を出力します:

ここに画像の説明を入力してください

これは、「削除」と呼ばれる関数です。最近別の理由で追加した関数ですが、直接または間接的に呼び出されないため、なぜここで取り上げられるのか迷っています。「削除」の完全なコードに興味がある人は、次のようになります。

// Array Remove - By John Resig (MIT Licensed)
Array.prototype.remove = function(from, to) {
   var rest = this.slice((to || from) + 1 || this.length);
   this.length = from < 0 ? this.length + from : from;
   return this.push.apply(this, rest);
}

添加:

以前に追加しなかったコードは、arguments配列の初期化でした。これが私が持っていたものです(それ以来、名前を引数ではなく「args」に変更したことに注意してください):

function ConditionalFormatting ( key , eventObject , setOfRules ) {
console.log ("Entering conditional formatting: key is " + key + ", eventObject is " + eventObject.attr('id') + ", setOfRules is " + setOfRules );
var ruleStrings = [];
ruleStrings = setOfRules.split (';');
var targetOverride = false;
jQuery.each ( ruleStrings , function ( i , ruleString ) {
    // There is a rule, now let's find out which one
    var targetElement;
    var args = [];
    args = ruleString.split('::');
    var rule = args.shift();
4

2 に答える 2

1

@Yoshiは正しいです:for inオブジェクト内のすべてのフィールドを一覧表示します-これは実際の配列です。

hasOwnPropertyメソッドを使用してみてください。

hideElements = arguments.shift().split ( ',' );
for (iterator in hideElements ) { 
    if (hideElements.hasOwnProperty(iterator))
    {
        console.log ('  --> hiding ' + hideElements[iterator] );
        lg_transitions ( {kind:"slide-up"} , { target : hideElements[iterator] } );
    }
}

for inこれが、通常、配列の反復に使用することを避け、for代わりに通常のループを使用する必要がある理由です。jsHint / jsLintは、投稿したコードに対して次のようなメッセージを表示します。

The body of a for in should be wrapped in an if statement to filter unwanted properties from the prototype.

サイドノート:

for (iterator in hideElements )グローバル変数を作成しますが、作成しiteratorませfor (var iterator in hideElements )ん。

于 2012-11-09T22:21:48.863 に答える
0

argumentsオブジェクトは実際の配列ではありません。そのため、機能はありませんshift()。配列の最初のオブジェクトが必要な場合は、インデックス0の要素(最初のオブジェクト)を取得します。さらに、通常のforループを使用してargumentsオブジェクトをトラバースします。

hideElements = arguments[0].split(',');

for ( var i = 0; i < hideElements.length; i++ ) {
    ...
}

argumentsは実際の配列ではありませんが、配列のように使用したい場合は、次を使用してArray.prototype.slice.call( arguments );ください。

if ( arguments.length > 0)
    hideElements = Array.prototype.slice.call( arguments ).shift();

そこから、hideElementsを配列として使用できます。

于 2012-11-09T22:24:53.923 に答える