提问人:Amnesiac 提问时间:11/12/2022 更新时间:11/12/2022 访问量:138
我需要帮助理解大卫·沃尔什(David Walsh)的“一次”功能
I need help understanding 'Once' function by David Walsh
问:
我试图确切地理解大卫·沃尔什(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
`
答:
0赞
rb612
11/12/2022
#1
JavaScript 背后的概念令人困惑,因为当我编写一个函数时,例如:this
function getPersonName() {
return this.name
}
我希望它被定义为具有属性的某个对象。根据范围的不同,我可能会定义这个,没有问题!但是为了让上面这样的函数正确引用,我们需要告诉它当我们使用该关键字时应该引用什么。this
name
this
例如,它允许我们执行以下操作:
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
对于关于参数
的问题,你需要知道
对象是所有非箭头函数中可用的局部变量。您可以使用函数的对象在该函数中引用函数的参数。
arguments
arguments
评论