我对命令模式教程
中的这个片段感到困惑是什么意思
return carManager[name] && carManager[name].apply( carManager, [].slice.call(arguments, 1) );
另外我可以理解它是否是carManager.execute(“buyVehicle”),然后carManager [“buyVehicle”]可以调用该函数,但是carManager [buyVehicle“,”Ford Escort“,”453543“]怎么样? / p>
(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" );
答案 0 :(得分:1)
简化示例:
return f && f();
&&
运算符在JavaScript中的工作方式是,如果左操作数是伪操作,则生成左操作数,否则生成右操作数。它也会短路,这意味着如果左操作数是假的,则根本不评估右操作数。在此,如果f
是真实的(例如函数)并返回其返回值,则会调用f
,如果f
是假的,则返回f
(例如{ {1}})。
换句话说,这是一种简短的写作方式:
undefined
具有以下实际含义:
return f ? f() : f;
当if (f) {
return f();
}
是一个具有函数属性的对象时,这反过来意味着只有当它存在并传递其返回值时才调用名为carManager
的方法。
另外我可以理解它是否是carManager.execute(“buyVehicle”),然后carManager [“buyVehicle”]可以调用该函数,但是carManager [buyVehicle“,”Ford Escort“,”453543“]怎么样? / p>
这个问题有点难以解释,但
name
可能会回答它。
答案 1 :(得分:1)
return carManager[name] && carManager[name].apply( carManager, [].slice.call(arguments, 1) );
如果carManager [name]中存在carManager [name]功能,则执行该功能。
carManager[name].apply( carManager, [].slice.call(arguments, 1) );
.apply()
用于在另一个或同一个对象上调用某个函数。它将对象作为第一个参数,将参数作为第二个参数。只要函数doent导致对象的现有属性发生任何更改,您就可以将任何对象作为第一个参数提供。例如,这是相同的。
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对象中存在的方法的实际数据。这就是为什么参数数组被切片的原因。
答案 2 :(得分:0)
它可以防止.bash_profile
是一个假的*值(很可能根本没有填充)。代码假设属性完全缺失或具有假值,或者具有函数。
如果carManager[name]
是假的,则返回该假值。
如果carManager[name]
不是假的(真实的),代码假定它是一个函数并调用它(通过carManager[name]
)并返回它返回的任何内容。
*“falsy”= apply
如果强制转换为布尔值。虚假值为false
,0
,NaN
,""
,null
,当然还有undefined
。所有其他值都是 truthy 。
答案 3 :(得分:0)
当你这样做时:
return carManager[name] && carManager[name].func();
您说:检查carManager[name]
是untruthy。如果是,则返回false。否则,执行func()
并返回其结果。
arguments object可用于获取传递给函数的所有参数,即使它们不存在于函数声明中。
function foo(baz) {
console.log(arguments[0]); // outputs baz: "me"
// same of: console.log(baz);
console.log(arguments[1]); // outputs "you"
console.log(arguments[2]); // outputs "them"
}
foo('me', 'you', 'them'); // call the function, pass 3 arguments