我对命令模式教程中的这段代码感到困惑,
这是什么意思
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[name] 存在于 carManager 中,则执行该函数。
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
返回数组的一部分。在这种情况下,它只是避免参数数组中的第一个元素。即它创建没有第一个元素的数组
carManager.execute( "buyVehicle", "Ford Escort", "453543" );
它调用调用函数。第一个参数提供函数的键。第二个和第三个参数提供必须传递到 carManager 对象中存在的方法中的实际数据。这就是参数数组被切片的原因。
关于javascript - 返回函数 &&?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49466072/