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方法中的第一个参数用于将当前对象传递给其超类,第二个参数用作普通参数。尝试这个,

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 回答