.bind()不返回javascript中的本机代码
我正在使用一个库,该库使用.bind()来更改要发送到第二个库的对象的上下文。第二个库需要使用.toString()来解析对象。因为.bind()返回一个带有[本机代码]的函数,所以整个项目都被破坏了。我想创建一个函数.bind()不返回javascript中的本机代码,javascript,Javascript,我正在使用一个库,该库使用.bind()来更改要发送到第二个库的对象的上下文。第二个库需要使用.toString()来解析对象。因为.bind()返回一个带有[本机代码]的函数,所以整个项目都被破坏了。我想创建一个函数simpleBind(fn,context),该函数将fn的上下文设置为context,但返回一个.toString()仍然有效的函数 var different_context = {foo: 4} function a_fun () {return this.foo} a
simpleBind(fn,context)
,该函数将fn
的上下文设置为context
,但返回一个.toString()
仍然有效的函数
var different_context = {foo: 4}
function a_fun () {return this.foo}
a_fun() // undefined
a_fun.toString() // 'function a_fun() {return this.foo}'
a_fun.bind(different_context).toString() // 'function bound a_fun() { [native code] }'
a_fun.bind(different_context)() // 4
理想情况下,simpleBind
函数的工作方式如下:
var boundFunction = simpleBind(a_fun, different_context);
boundFunction() // 4
boundFunction.toString() // 'function a_fun() {return this.foo}'
我已经读过很多关于js中上下文如何工作以及.bind()函数做什么的内容,但我一直没有弄明白这一点。这是不是因为某种原因而不可能
编辑
我意识到这个问题不太完整。要解析绑定函数的库需要一个字符串,该字符串类似于
“function[function\u name]([function\u arguments]){[代码不重要]}”
。因此,我尝试绑定函数,同时仍然生成具有该结构的字符串。我发现这非常有趣。我的解决方案有点老套,但似乎有效:
function simpleBind(fun, ctx){
var newFun = function(){
return fun.apply(ctx, arguments);
}
newFun.toString = function(){
return fun.toString();
}
return newFun;
}
通过你的测试
它的工作原理是将旧函数包装到新函数中,并在执行时传递新上下文。然后它替换新函数上的
toString
实现,以调用原始函数的toString
。MDN文档具有Erp。那太尴尬了。谢谢我没看到。但不幸的是,它不起作用。。。或者更确切地说,它的工作方式是bind()
,但是试图解析函数的库假定函数的名称和参数将位于字符串中的某个位置,并且MDN实现返回的字符串看起来不像常规的“function a_fun{return this.foo}”。我将对问题进行编辑以使其更清楚。图书馆为什么这样做?这是一个糟糕的API。与其乱弄字符串表示法,不如看看库对提取的数据做了什么。请解释您的实现如何确保toString()
-requirement.:)杰出的非常聪明。谢谢