用arrow函数模拟javascript函数

用arrow函数模拟javascript函数,javascript,functional-programming,Javascript,Functional Programming,我想知道是否有可能以某种方式将javascript arrow函数“绑定”到其作用域的原型实例 基本上,我想使用arrow函数从原型中获取一个实例变量。我知道单靠arrow函数无法做到这一点,但我很好奇,在分配它之前,是否可以将这个arrow函数绑定到实例范围。大致的想法是: String.prototype.myFunction = (() => { console.log(this.toString()); }).naiveBindNotionICantDescribe(Str

我想知道是否有可能以某种方式将javascript arrow函数“绑定”到其作用域的原型实例

基本上,我想使用arrow函数从原型中获取一个实例变量。我知道单靠arrow函数无法做到这一点,但我很好奇,在分配它之前,是否可以将这个arrow函数绑定到实例范围。大致的想法是:

String.prototype.myFunction = (() => {
    console.log(this.toString());
}).naiveBindNotionICantDescribe(String.prototype);
这相当于:

String.prototype.myFunction = function() {
    console.log(this.toString());
};
我很好奇,因为我想看看,如果你对javascript箭头函数理解得足够好,并且对它们很聪明,javascript箭头函数是否可以完全取代javascript函数,或者如果没有关键字“function”,即使是以聪明的方式,是否有绝对不可能完成的事情

以下是我的意思的一个例子:

/* anonymous self-contained demo scope. */
{
    /**
     * example #1: using function to reach into instance variable via prototype 
     * anonymous scope.
     */
    {
        String.prototype.get1 = function() {
            return this.toString();
        };
        console.log('hello'.get1());
    }

    /** 
     * example 2: what I want to do but can't express in a way that works.
     * This does not work.
     * anonymous scope.
     */
    {
        String.prototype.get2 = () => {
            return this.toString();
        };

        console.log('hello'.get2());  
    }  
}
这是可能做到的,还是函数绝对有必要进入实例变量,并且没有办法绕过这一点

表面解决方案

  • 包装器magicBind(谢谢Thomas)
  • 代码:

  • 从“胖箭头”到“函数”的函数转换器(灵感来自托马斯的答案)
  • 代码:

  • 没有显式使用“function”的第一个解决方案,它将“function”构造函数称为(()=>{})。构造函数避免使用“function”或“function”一词
  • 代码:


    到目前为止,这两种解决方案都允许隐藏“function”关键字,同时允许访问本地范围。

    否。从词汇上绑定
    值是箭头点函数

    它们不是函数声明和函数表达式的一般替代品

    我知道单靠箭头函数是做不到的,但我很好奇 如果还可以将此arrow函数绑定到实例 在分配它之前,先定义它的作用域

    确切地说,它可以单独完成,但您可以使
    成为所需的值。。。通过将其包装到普通函数中:

    String.prototype.get2=function(){
    返回(()=>this.toString())();
    };
    log('hello.get2())
    我希望做一些魔术,包括将实例作为参数传递给arrow函数,并使用这个实例“self”代替“this”。与hastebin.com/baxadaxoli.coffee类似但没有“功能”的东西。例如,在赋值过程中传递“self”,而不通过magicBind操作创建函数

    够神奇了吗?;)

    编辑:但是,你为什么坚持使用胖箭头呢。即使你必须跳转通过循环来实现你想要的。只是为了从你的.min.js文件中划掉几个字符

    /*
    log
    get
    更合适

    对于没有返回值的函数的结果,console.log()是没有意义的;如果该函数的唯一用途是调用console.log()本身,则更不用说了
    */

    只有一个问题:为什么要用胖箭头语法版本替换每个函数?是否要失去兼容性?胖箭头没有自己的
    参数
    -对象。所以你不能完全用胖箭头代替函数。它们的主要用途是充当回调函数。我想知道是否可以这样做。我正在考虑javascript是否可以在没有“function”关键字的情况下存在。是的,这对兼容性来说是可怕的,但是如果您了解它们之间的关系,并且可以用彼此的术语表示它们,那么您可以通过编写自己的解析器轻松地将箭头函数转换为函数(反之亦然).@Dmitry-No.
    bind
    /
    apply
    /
    call
    /etc对箭头函数没有影响。@Dmitry您在胖箭头中看到/使用的
    是一个闭包,您从周围上下文中括起了
    -变量。它与实际的(胖箭头-)函数调用无关。
    参数也是如此。从技术上讲,这不是胖箭头函数的要点。这只是后来在开发中添加的一个特性。它们的主要用途是作为函数的语法糖,但它们主要用于您希望在回调中访问父对象的地方。因此,您是说这是不可能的,还是说这不是它们应该使用的方式。这是不可能的。如果不是的话,我会说“是的,但你不应该”。我自己也得出了类似的结论:,只是我努力避免把名字放在里面,而不是按照我最初想要的方式明确设置原型。如果javascript中内置了这样的结构,那么您可以将任何胖箭头转换为“function”,而不使用“function”。事实上,我认为这正是我想要的:尽管这是一个非常奇怪的措辞,尤其是对于部分自我(这个)。通过这种方式,它的行为类似于绑定,而不是外部函数。我仍然很好奇,如果不使用“函数”,它是否真的是不可能的,但有了它,您可以在实现中隐藏“函数”关键字,并在必要时恢复它。不,它不是。这就是这个问题所有答案的要点。胖箭头没有(它们自己的)这个对象。这一点都不像
    bind()
    。Bind将一个传递的this对象锁定到位,而这段代码将每个函数调用上传递的this对象作为函数参数传播到某个回调。但是,你为什么坚持这样做?不需要编写
    函数
    一开始可能看起来不错,直到你意识到你必须编写
    (…).magicBind2()
    ,而且你使你的代码复杂化,限制了你的可能性我知道这一点。我很好奇“magicBind”的实现是否已经以不同的名称存在,或者是否可以从不使用“function”的现有函数派生出来。如果没有,那么不首先创建一种方法将胖箭头转换为函数是不可能的,就像在现有解决方案中所做的那样(之后,关键字
    var magicBind = (callback) => function() { 
        return callback(this);
    };
    String.prototype.get = magicBind((self) => {
        return self.toString();
    });
    console.log('hello'.get());
    
    Function.prototype.magicBind2 = function() {
        var self = this;
    
        return function() {
            return self(this);
        }
    };
    
    String.prototype.get2 = ((self) => {
        return self.toString();
    }).magicBind2();
    
    console.log('hello'.get2());
    
    var regex = /\{([.|\s|\S]+)\}/m;
    
    String.prototype.get = (() => {}).constructor(
        (() => {
            return this;
        }).toString().match(regex)[0]
    );
    
    console.log('hello, world'.get());
    
    var magicBind = (callback) => function (...args) {
        'use strict';
        return callback(this, args);
    }
    
    var log = (self, args) => {
      console.log('this: %o args: %o', self, args);
    };
    
    String.prototype.log = magicBind( log );
    
    'hello'.log();