我需要帮助理解大卫·沃尔什(David Walsh)的“一次”功能

I need help understanding 'Once' function by David Walsh

提问人:Amnesiac 提问时间:11/12/2022 更新时间:11/12/2022 访问量:138

问:

我试图确切地理解大卫·沃尔什(David Walsh)的这个Once函数是如何工作的:

`

function once(fn, context) { 
    var result;

    return function() { 
        if(fn) {
            result = fn.apply(context || this, arguments);
            fn = null;
        }

        return result;
    };
}

// Usage
var canOnlyFireOnce = once(function() {
    console.log('Fired!');
});

canOnlyFireOnce(); // "Fired!"
canOnlyFireOnce(); // nada

`

我知道它接受一个函数作为参数,并返回一个只调用传递的函数一次的函数。

但我试图了解每个部分在做什么。谁能帮忙解释一下?尤其是这部分:

result = fn.apply(context || this, arguments);

为什么是OR符号?什么是“这个”,它如何从 FN 获取参数?“上下文”有什么作用?


我为 school 编写了一个类似的 once() 函数,该函数返回传递函数的结果,并存储结果以在函数尝试再次调用时再次返回。这需要大量的试验和错误,我只是想牢牢掌握它如何工作的所有组成部分。

`

function add(x, y) {
  return x + y;  
}


function once(fn) {

  let timesRan = 0;
  let result;
  
  function doOnce() {
    if (timesRan === 0) {
      timesRan = 1;
      result = fn.apply(this, arguments); //I don't understand how this gets the arguments from AddOnce
      console.log(`did it once: ${result}`)
      return result;
    } else {
      return result;
    }
  }  
  return doOnce;

}


var addOnce = once(add);

console.log(addOnce(1, 2)); // test first call, expected value: 3
console.log(addOnce(2, 5)); // test second call, expected value: 3
console.log(addOnce(8, 22)); // test third call, expected value: 3
  

`

javascript 函数 回调 参数 this

评论


答:

0赞 rb612 11/12/2022 #1

JavaScript 背后的概念令人困惑,因为当我编写一个函数时,例如:this

function getPersonName() {
    return this.name
}

我希望它被定义为具有属性的某个对象。根据范围的不同,我可能会定义这个,没有问题!但是为了让上面这样的函数正确引用,我们需要告诉它当我们使用该关键字时应该引用什么。thisnamethis

例如,它允许我们执行以下操作:

var canOnlyFireOnce = once(function() {
  console.log(this.name)
}, {name: "John"});

canOnlyFireOnce() // prints John
canOnlyFireOnce() // nada

了解 bind 函数在 JavaScript 中的用例可能会有所帮助,以理解为什么拥有这个(没有双关语)是有用的。

0赞 Manfred 11/12/2022 #2

function.apply 中上下文的含义已经在 rb612 的答案中解释过了。this

对于关于参数的问题,你需要知道

对象是所有非箭头函数中可用的局部变量。您可以使用函数的对象在该函数中引用函数的参数。argumentsarguments