Javascript 替换新函数中的arguments.callee

Javascript 替换新函数中的arguments.callee,javascript,function,self-reference,Javascript,Function,Self Reference,一些字符串通过新函数(…)调用转换为函数 如何在不使用参数的情况下在字符串中获取此函数的引用。被调用方 var f = new Function('return arguments.callee.smth'); f.smth = 128; f(); // 128 这样做的唯一方法是使用闭包 例如: var f = (function () { var f = new Function('return this().smth').bind(function () { return f });

一些字符串通过
新函数(…)
调用转换为函数

如何在不使用
参数的情况下在字符串中获取此函数的引用。被调用方

var f = new Function('return arguments.callee.smth');
f.smth = 128;
f(); // 128

这样做的唯一方法是使用闭包

例如:

var f = (function () {
  var f = new Function('return this().smth').bind(function () { return f });
  return f;
})();

f.smth = 128;
f();
大约:

var f = (function (g) {
  return function f() {
    return g.apply(f, arguments)
  };
})(new Function('return this.smth'));

f.smth = 128;
f();
无论如何,看起来像是
参数。被调用方
在构造的函数中工作,而不考虑严格模式

有关该主题的其他链接:

  • 使用arguments.callee时没有好的选择

    但是,在下面这样的情况下,对于
    参数.callee
    ,没有替代方法,因此它的弃用可能是一个bug(请参见bug)


    • 做这件事的唯一方法是使用闭包

      例如:

      var f = (function () {
        var f = new Function('return this().smth').bind(function () { return f });
        return f;
      })();
      
      f.smth = 128;
      f();
      
      大约:

      var f = (function (g) {
        return function f() {
          return g.apply(f, arguments)
        };
      })(new Function('return this.smth'));
      
      f.smth = 128;
      f();
      
      无论如何,看起来像是
      参数。被调用方
      在构造的函数中工作,而不考虑严格模式

      有关该主题的其他链接:

      • 使用arguments.callee时没有好的选择

        但是,在下面这样的情况下,对于
        参数.callee
        ,没有替代方法,因此它的弃用可能是一个bug(请参见bug)


      你不能。为什么需要这样做(您使用
      函数
      构造函数的目的是什么)?请提供您的实际代码,以便我们为您的问题提出一个合适的解决方案。也许可以看看如何将值传递到构造函数的作用域中。@Bergi,实际上我想这样做,但关于通过生成函数本身获取自引用的想法对我来说似乎很有趣。如果您删除此问题,“还是我们应该回答这是不可能的?”贝基回答。但答案对于课堂提问是无用的,你不能。为什么需要这样做(您使用
      函数
      构造函数的目的是什么)?请提供您的实际代码,以便我们为您的问题提出一个合适的解决方案。也许可以看看如何将值传递到构造函数的作用域中。@Bergi,实际上我想这样做,但关于通过生成函数本身获取自引用的想法对我来说似乎很有趣。如果您删除此问题,“还是我们应该回答这是不可能的?”贝基回答。但是对于类的问题,答案是无用的。它不会返回
      新函数()
      ,而是一个“绑定函数”(例如没有
      .prototype
      )。你本可以变得更简单:-)@Bergi,“你本可以变得更简单:-”)-怎么做?通过废弃
      新函数
      ,只返回一个闭包(从函数表达式创建),我的意思是。它不返回
      新函数()
      ,而是返回一个“绑定函数”(例如,没有
      .prototype
      )。你本可以变得更容易:-)@Bergi,“你本可以变得更容易:-)”-怎么做?我的意思是,通过废弃
      新函数
      并返回一个闭包(从函数表达式创建),就可以了。