在javascript中缓存结束符

| 阅读以下问题的答案后:JavaScript内部函数和性能 我想知道在这种情况下是否可以缓存内部函数(doSomethingCool):
function newUser(user){
         function doSomethingCool(){
                 console.log(user);
         } 
}
    
已邀请:
        您不能真正缓存关闭。如果这样做,它仍然会关闭最初定义的函数的变量。 例如,您可以考虑这样做,乍一看似乎还可以:
var newUser = (function() {
    var doSomethingCool;

    function newUser(user){
         doSomethingCool = doSomethingCool || function(){console.log(user);};
         doSomethingCool();
    }

    return newUser;
}());
我们第一次调用
newUser
时,将创建
doSomethingCool
函数。这是输出:
> newUser(\'foo\')
  foo
当我们第二次调用该函数时,闭包将被重用。这是输出:
> newUser(\'bar\')
  foo
为什么?因为闭包仅关闭函数调用的变量,所以定义在其中。 如果您确实想“缓存”该函数,则必须对其进行参数化:
var newUser = (function() {
    var doSomethingCool;

    function newUser(user){
         doSomethingCool = doSomethingCool || function(user){console.log(user);};
         doSomethingCool(user);
    }

    return newUser;
}());
但我不会称其为关闭。从技术上讲,它是一个闭包,但是您不使用此属性。 实际上,这样写起来要容易得多:
var newUser = (function() {
    var doSomethingCool = function(user){...};

    function newUser(user){
         doSomethingCool(user);
    }

    return newUser;
}());
    
        使用闭包的目的是保留创建它的上下文。如果您“缓存”闭包,则对ѭ8reference的引用将始终是相同的,从而无法达到目的。您可能想要的是:
function User(name) {
   this.name = name;
}

User.prototype.doSomethingCool = function() {
   console.log(this.name);
}

var userA = new User(\'a\');
var userB = new User(\'b\');

userA.doSomethingCool();
userB.doSomethingCool();
使用该代码,仅在User原型上创建了一个
doSomethingCool
函数,但是其行为根据其调用方式而改变。 如果您只是想制作一个仅在ѭ2内使用但不利用闭包属性的实用程序函数,则最好移动该函数并接受用户作为参数。就是说,我非常怀疑将其留在那会以任何明显的方式影响您的表现。     

要回复问题请先登录注册