传递参数VS与参数一起应用的区别

时间:2016-04-19 16:28:56

标签: javascript ajax function backbone.js apply

我有一个骨干集合,使用save mixin进行批量保存(只是一种实用方法,因为骨干本身不支持批量保存)

// Cars collection
define([
  'Car',
  'BulkSave'
], function(Car, BulkSave) {
     return Backbone.Collection.extend({
        model: Car,
        save: function() {
            var options = {
                ...
                onSuccess: function(cars) {
                    // do something with cars
                    console.log(cars);
                }
                ...
            };

            this.bulkSave(options);
        }
     }).mixin(BulkSave);
});
// BulkSave Mixin definition 

define([], function(){
    return {
        save: function(options){
            var thisCollection = this;

            $.ajax({
                type: options.type,
                url: options.url,
                dataType: 'json',
                contentType: 'application/json',
                data: JSON.stringify(options.data),
                success: function(data) {
                   // data would give me the list of cars
                   // that changed
                   options.onSuccess.apply(thisCollection, arguments); 
                }
            });
        }
    };
});

因此,当我想要对该集合进行批量保存时,我会调用

cars.save();

我在这里的问题是在success方法的ajax回调中,我将调用我将在其中传递的options对象中的onSuccess方法。参数。

之间有什么不同
options.onSuccess(arguments);
// this logs an arrayList of 3 properties
// [0]  -- the actual list of cars which changed
// [1]  -- 'success'
// [2]  -- the xhr object

vs

options.onSuccess(thisCollection, arguments);
// When i do this instead 
// it logs
// the list of cars that changed instead

有人可以解释两种情景之间的区别吗?

1 个答案:

答案 0 :(得分:3)

在第一个示例中,您只需将arguments对象传递给该函数。

在第二个中,您使用apply调用该函数。简而言之,apply函数使用" spread"来调用函数。参数。这意味着你的函数被调用就像你的函数(arg0 / *,其中arg是来自参数* /,arg1,argN,...的单个元素),给定"这个"。有关更多信息,请参阅我指出的页面。