javascript - 在 JavaScript 函数中运行而不每次都重新声明它

标签 javascript functional-programming

可以在 javascript 的函数内部声明一个函数。 喜欢:

function my(){
   function check(){
      return true;
   }

   console.log( check() ? "yes" : "no");
}

my();

但是,它可能不是最快的,因为每次调用 my 时,都必须重新声明检查。但是在 my 之外声明检查会污染全局范围。

如果 my 是构造函数 My,则可以将检查添加到其原型(prototype)中,但不幸的是,这样做不能使用正常功能。

解决这个问题有什么方便的方法?

最佳答案

如果您真的可以在对 my 的调用之间重用 check,那么您可以在其中创建 mycheck一个内联调用的作用域函数并从中返回 my:

var my = function() { // <=== Scoping function

    function my(){
        console.log( check() ? "yes" : "no");
    }

    function check(){
        return true;
    }

    return my;        // <=== Returns `my`
}();                  // <=== () calls scoping immediately

my();

现在,check 是私有(private)的,但不会在您每次调用 my 时重新创建。

这是揭示模块模式的一个简单示例。您在作用域函数中隐藏了大部分内容,并“揭示”了您想要发布的内容。如果您要发布不止一件东西,您会返回一个对象,其中的东西作为属性。

有时您会看到它在作用域函数周围用括号编写,不是因为它们是必需的(如果您使用返回值则不是必需的),而是因为 you'd need them (or something with a similar effect)如果您没有使用返回值,那么它更明显地表明它是一个作用域函数:

var my = (function() { // <=== Scoping function

    function my(){
        console.log( check() ? "yes" : "no");
    }

    function check(){
        return true;
    }

    return my;         // <=== Returns `my`
})();                  // <=== () calls scoping immediately

my();

关于javascript - 在 JavaScript 函数中运行而不每次都重新声明它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31624299/

相关文章:

ios - Swift 编译器错误 : "Expression too complex" on a string concatenation

javascript - Jquery覆盖我的对象中的 "this"

javascript - 如何使用 javascript 填充下拉列表?

javascript - 有什么方法可以通过属性访问函数的返回值吗?

functional-programming - 如何在 OCaml 中使用 Map/定义实际上是 Map 的类型?

python - 从可迭代的每个元素中删除单个键的优雅方法

javascript - 使用鼠标在 html5 canvas 中水平和垂直倾斜绘图

javascript - 如何延迟 'not found' 错误直到数据加载到 Vue.js

javascript - 辅助功能键盘仅选项卡到 z-index "Back to Top"

performance - 方案:数据序列化,高效[和功能]