用arrow函数模拟javascript函数
我想知道是否有可能以某种方式将javascript arrow函数“绑定”到其作用域的原型实例 基本上,我想使用arrow函数从原型中获取一个实例变量。我知道单靠arrow函数无法做到这一点,但我很好奇,在分配它之前,是否可以将这个arrow函数绑定到实例范围。大致的想法是:用arrow函数模拟javascript函数,javascript,functional-programming,Javascript,Functional Programming,我想知道是否有可能以某种方式将javascript arrow函数“绑定”到其作用域的原型实例 基本上,我想使用arrow函数从原型中获取一个实例变量。我知道单靠arrow函数无法做到这一点,但我很好奇,在分配它之前,是否可以将这个arrow函数绑定到实例范围。大致的想法是: String.prototype.myFunction = (() => { console.log(this.toString()); }).naiveBindNotionICantDescribe(Str
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());
}
}
这是可能做到的,还是函数绝对有必要进入实例变量,并且没有办法绕过这一点
表面解决方案:
到目前为止,这两种解决方案都允许隐藏“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();