2012-08-08 56 views
0

我讀到一篇文章關於how speed up javascript,我試圖複製它的代碼可能提高循環速度:混淆關於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方法有關嗎?它與上下文參數有關嗎?

你可以看到演示here

回答

0

是的,你說得對。 .call方法是javascript中繼承的概念,並且.call方法中的第一個參數用於將當前對象傳遞給其超類,第二個參數用作常規參數。試試這個,

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); 
} 
1

您通過上下文作爲第一個參數來callprocess.call(context, item);。雖然你永遠不會將上下文的論點傳遞給chunk,但這不是問題,因爲你從不使用this

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

0

函數的call方法調用與指定的this功能。您傳遞函數的第一個參數(在您撥打process.call(item, context)的電話中爲item)將通過函數中的this關鍵字訪問。

所以,進行此更改正確引用:

var process = function() { 
    console.log(this); 
    dosomething1(this); 
    dosomething2(this); 
}