callback.call()和callback() 的区别

发布于 2022-09-04 01:05:13 字数 457 浏览 11 评论 0

jQuery中each方法的实现使用call方法,call方法可以设置上下文,第一,在下例中数组each效果一样,为什么不直接调用呢?

     if (likeArray(elements)) {
         for (i = 0; i < elements.length; i++) {
               callback(i, elements[i]);
           }
     }
if (likeArray(elements)) {
        for (i = 0; i < elements.length; i++) {
              if (callback.call(elements[i], i, elements[i]) === false) break;                 
        }
  }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

吐个泡泡 2022-09-11 01:05:13

Function.call

第一个问题:

通过call 可以改变this的指向。

var testCall = function(obj, callback){
    callback.call(obj, 1);
}

testCall(["一、改变this的指向", "二、函数内部可以通过this调用"], function(index){
    //使用 call方式调用,可以直接通过this访问 call 的第一个参数传入的对象。
    alert(this[index]); //二、函数内部可以通过this调用    
});

不使用 call方式调用,没有使用this。

var test = function(obj, callback){
    callback(obj, 1);
}

test(["一、改变this的指向", "二、函数内部可以通过this调用"], function(index){
    //不使用 call方式调用,没有使用this。
    alert(this[index]); //undefined
});

jQuery.each 应该就是使用 call 修改 的 this 指向;

$.each([1,2,3], function (index, item) {
    console.log({index:index,value:item,_this:this});
});

/*
  Object {index: 0, value: 1, _this: Number}
  Object {index: 1, value: 2, _this: Number}
  Object {index: 2, value: 3, _this: Number}
*/

没看 jQuery 源代码,用 callback.call 山寨个,应该实现方式是一样的。

var each = function(arr, callback){
  for( var index = 0 ; index < arr.length ; index++ ){
    callback.call(arr[index], index, arr[index]);
  }
}

each([1,2,3], function (index, item) {
    console.log({index:index,value:item,_this:this});
});

/*
  Object {index: 0, value: 1, _this: Number}
  Object {index: 1, value: 2, _this: Number}
  Object {index: 2, value: 3, _this: Number}
*/

注意:this,如果没有 使用 call,在回调函数中是没法使用 this 的。

第二个问题:
为什么each 不用用 callback,因为你写错了,函数传参数必须使用 括号。

for (key in elements) {
                    // callback[key, elements[key]]//这里不能工作
                    /*
                        应该是 callback(key, elements[key]);
                    */
                    if (callback.call(elements[key], key, elements[key]) === false) {
                        break;
                    }
                }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文