gpt4 book ai didi

javascript - 是否可以在没有外部输入的情况下使功能具有 self 意识

转载 作者:搜寻专家 更新时间:2023-11-01 05:10:07 27 4
gpt4 key购买 nike

背景

我想要一个跟踪其自身状态的函数:

var myObject = {

myFunction: function () {

var myself = this.myFunction;
var firstTime = Boolean(!myself.lastRetry);

if (firstTime) {

myself.lastRetry = Date.now();
return true;
}

// some more code

}
}

上述代码的问题在于this 的值将取决于函数调用的位置。我希望该函数能够在不使用的情况下引用自身:

  • myObject.myFunction
  • .bind()
  • .apply()
  • .call()

问题

是否可以独立于其调用站点并在没有外部引用的任何帮助的情况下为函数提供这种 self 意识?

最佳答案

如果您想将该状态存储在函数实例上,请为函数命名,并在其中使用该名称:

var myObject = {

myFunction: function theFunctionName() {
// ^^^^^^^^^^^^^^^--------------------- name
var firstTime = Boolean(!theFunctionName.lastRetry);
// ^--------------------------- using it
if (firstTime) {

theFunctionName.lastRetry = Date.now();
// ^------------------------------------------------ using it
return true;
}

// some more code

}
};

只要你想递归地使用一个函数,你就会这样做。当您以这种方式为函数命名时(将名称放在 function 之后和 ()之前),该名称在函数自己的代码范围内。(不是如果它是一个函数表达式,则包含该函数的代码在范围内,但如果它是一个函数声明,则它在范围内。你的是一个表达式。)

那是一个命名函数表达式(之前您有一个匿名函数表达式)。您可能会听到有关 NFE 的警告,但各种 JavaScript 实现所遇到的问题基本上已经过去了。 (尽管如此,IE8 仍然无法正确处理它们:更多内容在 this post on my blog 中。)

不过,您可能会考虑通过 IIFE 将该状态保密:

var myObject = (function(){
var lastRetry = null;
return {
myFunction: function() {
var firstTime = Boolean(!lastRetry);
if (firstTime) {

lastRetry = Date.now();
return true;
}

// some more code

}
};
})();

现在,外部匿名函数之外的任何东西都无法看到 lastRetry。 (如果您支持顽固的 XP 用户,则不必担心 IE8。:-))


旁注:一元 ! 运算符总是 返回一个 bool 值,因此您的

var firstTime = Boolean(!theFunctionName.lastRetry);

...完全等同于:

var firstTime = !theFunctionName.lastRetry;

...但是有一个额外的不必要的函数调用。 (并不是说它会伤害任何东西。)

关于javascript - 是否可以在没有外部输入的情况下使功能具有 self 意识,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37188030/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com