JavaScript中的回调只是空白函数吗?

时间:2015-08-10 14:30:54

标签: javascript callback

我一直试图绕过回调,出于好奇,我正在通过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

3 个答案:

答案 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 operatorbar = typeof bar !== 'undefined' ? bar : barDefault; 设置为空(nop)函数(如果未设置)。您可以在以下示例中看到该行为:

&#13;
&#13;
function foo(bar = someDefault) {
  ...
}
&#13;
&#13;
&#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