使用javascript的Function.prototype.bind()测试变量是否是特定的绑定函数

McS*_*man 1 javascript bind

我试图找出如何测试变量是否是特定绑定函数的实例.请考虑以下示例:

var func = function( arg ) {
    // code here
}

myFunc = func.bind( null, 'val' );

if( myFunc == func ) {
    console.log( true );
} else {
    console.log( false );
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这导致错误.是否有某种方法来测试变量以找出它绑定的函数?

jfr*_*d00 7

不,没有办法做到这一点. .bind()返回一个内部调用原始函数的新函数.该新功能上没有用于检索原始功能的接口.

按照ECMAScript规范15.3.4.5,返回的"绑定"功能将有内部属性[[TargetFunction]],[[BoundThis]][[BoundArgs]],但这些属性是不公开.

如果您告诉我们您尝试解决的更高级别问题,我们可能会提出不同类型的解决方案.


如果您自己控制.bind()操作,可以将原始函数作为属性放在绑定函数上,并且可以测试该属性:

var func = function( arg ) {
    // code here
}

myFunc = func.bind( null, 'val' );
myFunc.origFn = func;

if( myFunc === func || myFunc.origFn === func) {
    console.log( true );
} else {
    console.log( false );
}
Run Code Online (Sandbox Code Playgroud)

演示:http://jsfiddle.net/jfriend00/e2gq6n8y/

您甚至可以自行.bind()更换自己的替代品.

function bind2(fn) {
    // make copy of args and remove the fn argument
    var args = Array.prototype.slice.call(arguments, 1);
    var b = fn.bind.apply(fn, args);
    b.origFn = fn;
    return b;
}
Run Code Online (Sandbox Code Playgroud)