0

javascriptの速度を上げる方法についての記事を読みました。ループ速度を向上させる可能性のあるコードをコピーしてみます。

var chunk = function (array, process, context) {
        setTimeout(function(){  
            var item = array.shift();  
            console.log('item', item);//this could show correctly
            process.call(item, context);  

            if (array.length > 0){  
                setTimeout(arguments.callee, 100);  
            }  
        }, 100); 
    }

次に、パラメーターを渡そうとしますが、パラメーターの使用方法がわかりません。実行したのcontextは次のとおりです。

  var dosomething1 = function (item) {
      console.log('this is begin ' + item)
  }

  var dosomething2 = function (item) {
      console.log('this is end ' + item);
  }

  var process = function (item) {
        console.log(item); //this show undefined
        dosomething1(item);
        dosomething2(item);
  }

  var temp = ["a", "b", "c", "d"];
  chunk(temp, process);​

問題はプロセス関数、itemログundefinedで始まり、アイテムはでしか正しく表示できませんでしたchunk

では、どうすればこの問題を解決できますか?メソッドに関連していると思いprocess.callますか?コンテキストパラメータに関連していますか?

ここでデモを見ることができます

4

3 に答える 3

1

コンテキストを最初のパラメータとして、に渡しcallますprocess.call(context, item);chunkただし、を使用することはないため、問題とならないコンテキストの引数を渡すことはありませんthis

http://jsfiddle.net/NrBmD/2/

于 2012-08-08T06:27:57.443 に答える
0

関数のcallメソッドは、指定されたで関数を呼び出しますthis。関数に渡す最初のパラメーター(この場合itemはへの呼び出し)には、関数内のキーワードprocess.call(item, context)からアクセスできます。this

したがって、適切に参照するようにこの変更を行います。

var process = function () {
    console.log(this);
    dosomething1(this);
    dosomething2(this);
}
于 2012-08-08T06:30:01.457 に答える
0

はい、あなたが正しい。.callメソッドはjavascriptの継承の概念であり、.callメソッドの最初のパラメーターは現在のオブジェクトをそのスーパークラスに渡すために使用され、2番目のパラメーターは通常のパラメーターとして使用されます。これを試して、

var chunk = function (array, process, context) {
    setTimeout(function(){  
        var item = array.shift();  
        console.log('item', item);//this could show correctly
        process.call(this, item);// the first parameter is the current object
        if (array.length > 0){  
            setTimeout(arguments.callee, 100);  
        }  
    }, 100); 
}
于 2012-08-08T06:28:48.517 に答える