我对命令模式教程中的这一片段感到困惑,

这是什么意思

return carManager[name] && carManager[name].apply( carManager, [].slice.call(arguments, 1) );

我也可以理解它是否是carManager.execute(“ buyVehicle”),然后carManager [“ buyVehicle”]可以调用该函数,但是carManager [buyVehicle“,” Ford Escort“,” 453543“]呢?

    (function(){

      var carManager = {

        // request information
        requestInfo: function( model, id ){
          return "The information for " + model + " with ID " + id + " is foobar";
        },

        // purchase the car
        buyVehicle: function( model, id ){
          return "You have successfully purchased Item " + id + ", a " + model;
        },

        // arrange a viewing
        arrangeViewing: function( model, id ){
          return "You have successfully booked a viewing of " + model + " ( " + id + " ) ";
        }

      };

    })();

    carManager.execute = function ( name ) {
        return carManager[name] && carManager[name].apply( carManager, [].slice.call(arguments, 1) );
    };

    carManager.execute( "buyVehicle", "Ford Escort", "453543" );

最佳答案

return carManager[name] && carManager[name].apply( carManager, [].slice.call(arguments, 1) );


如果carManager中存在功能carManager [name],则执行该功能。

carManager[name].apply( carManager, [].slice.call(arguments, 1) );


.apply()用于在其他或同一对象上调用某个功能。它以对象为第一参数,以参数为第二参数。您可以提供任何对象作为第一个参数,只要该函数确实导致该对象的现有属性发生任何更改。例如,这是相同的。

carManager.execute = function ( name ) {
  return carManager[name] && carManager[name].apply( {}, [].slice.call(arguments, 1) );
};


码:

[].slice.call(arguments, 1);


.call()确实具有与apply()相同的功能。它采用Array对象的slice函数,然后将其调用到其他一些对象上,这次是在arguments(object)数组上。 slice返回数组的一部分。在这种情况下,它只是避免了arguments数组中的第一个元素。即它使数组没有第一个元素

carManager.execute( "buyVehicle", "Ford Escort", "453543" );


它调用了invoke函数。第一个参数提供函数的键。第二个和第三个参数提供必须传递到carManager对象中存在的方法中的实际数据。这就是参数数组被切片的原因。

关于javascript - 使用&&返回函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49466072/

10-12 13:22