javascript - jQuery each 方法第三個參數args 如何解釋?
大家讲道理
大家讲道理 2017-07-05 10:53:30
0
1
1154

空閒的時候看看jq源碼,發現each#方法、map方法、makeArray都申明了:僅限於內部使用(/ / arg is for internal usage only),查閱了大量資料都沒找到答案,就連jquery的api都只給了前兩個參數的解釋,難道是調試用的?那怎麼用呢?

原始碼

// args is for internal usage only
    each: function( obj, callback, args ) {
        var value,
            i = 0,
            length = obj.length,
            isArray = isArraylike( obj );

        if ( args ) {
            if ( isArray ) {
                for ( ; i < length; i++ ) {
                    value = callback.apply( obj[ i ], args );

                    if ( value === false ) {
                        break;
                    }
                }
            } else {
                for ( i in obj ) {
                    value = callback.apply( obj[ i ], args );

                    if ( value === false ) {
                        break;
                    }
                }
            }

        // A special, fast, case for the most common use of each
        } else {
            if ( isArray ) {
                for ( ; i < length; i++ ) {
                    value = callback.call( obj[ i ], i, obj[ i ] );

                    if ( value === false ) {
                        break;
                    }
                }
            } else {
                for ( i in obj ) {
                    value = callback.call( obj[ i ], i, obj[ i ] );

                    if ( value === false ) {
                        break;
                    }
                }
            }
        }

        return obj;
    }

經過大量測試,我發現第三個參數還有限制,不能傳的類型有:數字,字串,json等;只能傳數組;別的類型我就沒在一一測試了
在傳入數組的時候,callback必須用和args數組中長度一樣多的參數來一一接收args數組中的值,如果數組中有三個值,callback只有一個形參,那麼這個形參只能接收到args[0]的值。而且我們可以透過arguments來印出args中的所以傳過來的值(都是按照順序全部傳過來了的),其中一個測試程式碼:

// 首先each我传入了三个参数
// 通过这种方式,我取到了a,b,c 的三个值分别为'wo', 'ai', 'ni'
// 多次尝试,我发现args传过来的三个参数是按照顺序排列好的,
// 如果只有一个参数那么,我们就只能取到'wo',
// 当
var arr = [5, 7, 5];
$.each(
    arr,
    function(a, b, c){
        console.log(a); // 'wo'
        console.log(b); // 'ai'
        console.log(c); // 'ni'
        console.log(arguments); //["wo", "ai", "ni", callee: function, Symbol(Symbol.iterator): function]
        console.log(this) // 回调中的所有参数会根据each第一个参数的长度进行多次打印,所以每次打印的this都指向每一次的arr的值
    },
    ['wo', 'ai', 'ni']
)

參考

我發現在segmentfault 之前也有人問過這個問題,可惜沒有人給答案
/q/10...

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回覆(1)
巴扎黑

謝謝大家,問題解決了,我知道為什麼了

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板