我一直试图绕过回调,出于好奇,我正在通过todomvc中的vanilla js的源代码找到这个函数:
Store.prototype.findAll = function (callback) {
callback = callback || function () {};
callback.call(this, JSON.parse(localStorage[this._dbName]).todos);
};
以下陈述是什么意思?
callback = callback || function () {};
这是否意味着回调只是空白函数?
另外,它们之间的区别是什么
callback.call(this)
和callback(anything)
?
我尝试修改此行
callback.call(this, JSON.parse(localStorage[this._dbName]).todos);
到
callback(JSON.parse(localStorage[this._dbName]).todos);
但结果是一样的。为什么会callback.call
而不是简单callback
?
答案 0 :(得分:2)
不,回调不是&#34;只是空白&#34;。这里函数接收一个回调作为参数,并简单地确保它是一个函数。如果没有传递回调,它将被设置为空函数,但至少它可以被调用的 函数。将参数设置为默认值(此处为:空函数)简化了以下代码,否则如果回调函数不是函数,则需要一堆Ankle.r<-read.csv(file=paste("C:/path/to/file",name,sep=""),header=T,sep=",")
条件来执行不同的操作。
对于问题的其他部分,请参阅How does the "this" keyword work?。
答案 1 :(得分:2)
JavaScript中的回调只是空白函数吗?
回调不仅仅是空白功能。它们是稍后可以调用的函数(通常带有一些参数)。有时,它们是可选的,主机函数将允许您传递回调或不传递回调。如果未传递回调,则主机函数可以检测到它未作为参数传递并相应地调整其行为。
以下陈述是什么意思?
callback = callback || function(){};
这是否意味着回调只是空白函数?
这是一种常见的设计模式,用于确保函数的参数在调用者未传递的情况下具有有意义的值,因此函数可以在内部继续执行,并假设调用者传递了参数,即使来电者没有通过辩论。
代码callback = callback || function () {};
等同于:
if (callback) {
callback = callback;
} else {
callback = function() {};
}
在Javascript中,||
运算符将结果指定为真正的两个操作数中的第一个(如果两者都不真实,则为false
),因此如果callback
具有值,然后它成为||
操作数的结果,你得到callback = callback
。否则,如果callback
不是真实的,它会指定callback
具有默认函数值,该值允许函数的其余部分在假设callback
具有合法值的情况下运行。这使得所有其他功能代码在使用之前必须检查callback
是否具有合法值。
另外,
callback.call(this)
和callback(anything)
之间的区别是什么?someFunction.call()
?
this
允许您在函数运行时使用callback.call(this)
的值。所以this
使得回调在运行当前函数时具有相同的callback(...)
值。如果您刚刚.call()
没有this
,那么window
将采用默认值undefined
对象,或者如果在严格模式下运行,它将是this
。
如果特定的回调没有在其代码中引用.call()
的值,那么使用Store
或不使用它会在结果上没有差异,但是在这种情况下,它是一个为回调提供的额外功能,它可以通过访问回调内的this
值来访问正在使用的this
对象的当前实例。
像这样设置Store
的值允许您使用对象的方法作为直接回调,因为这与对象方法具有相同的调用约定。
所以,如果你有一个var s = new Store();
这样的对象:
setName()
并且,有一个名为this
的对象的方法使用s.findAll(s.setName);
来引用它自己的对象实例,你可以这样做:
callback.call(this)
这只会有效,因为this
在回调中将实例值设置为product.values.all? {|x| !x.blank? }
的值。
答案 2 :(得分:0)
模式:
var barDefault = 'No value provided!';
function foo(bar) {
bar = bar || barDefault;
console.log(bar);
}
foo(); // No value provided, since no arguments passed
foo(3); // Argument passed, value provided
foo(0); // Tricky case: falsy argument passed, so function assumes no value was provided
是一种常见(但过时)的方法,如果调用者未定义函数参数,则将其设置为默认值。
在这种情况下,该函数利用所有函数是真实的,JS' unusual OR operator将bar = typeof bar !== 'undefined' ? bar : barDefault;
设置为空(nop)函数(如果未设置)。您可以在以下示例中看到该行为:
function foo(bar = someDefault) {
...
}
&#13;
从示例中可以看出,当传递一个伪造的参数时,这种模式可能会导致问题,因为OR运算符将回退到默认值。要解决这个问题,请使用:
function makeAdder(x) {
return function(y) {
return x + y;
};
}
var addFive = makeAdder(5);
console.assert(addFive(2) === 7);
console.assert(addFive(-5) === 0);
将显式检查未定义的参数。
使用ES6和默认参数值,可以更恰当地表达为:
if..else