Я знаю, что внутри функции это this
.
var func = function {
return this.f === arguments.callee;
// => true, if bound to some object
// => false, if is bound to null, because this.f === undefined
}
var f = func; // not bound to anything;
var obj = {};
obj1.f = func; // bound to obj1 if called as obj1.f(), but not bound if called as func()
var bound = f.bind(obj2) // bound to obj2 if called as obj2.f() or as bound()
Отредактировано:
Фактически вы не вызываете obj2.f()
, поскольку f
не становится свойством obj2
конец редактирования.
Возникает вопрос: как найти объект, связанный с функцией, вне этой функции?
Я хочу добиться этого:
function g(f) {
if (typeof(f) !== 'function') throw 'error: f should be function';
if (f.boundto() === obj)
// this code will run if g(obj1.f) was called
doSomething(f);
// ....
if (f.boundto() === obj2)
// this code will run if g(obj2.f) or g(bound) was called
doSomethingElse(f);
}
и частичное приложение без изменения объекта, к которому привязана функция:
function partial(f) {
return f.bind(f.boundto(), arguments.slice(1));
}
Консенсус:
Вы не можете этого сделать. Takeaway: используйте bind
и this
с большой осторожностью:)