2016-06-15 9 views
0

Посмотрев на this answer Мне стало любопытно, можно ли переназначить addTogether.bind, чтобы вы могли его вызвать без контекстного аргумента. Некоторые из различных методов, которые я пробовал ниже:Как удалить аргумент контекста .bind()

// these are intended as separate attempts, don't execute all of them sequentially 
addTogether.bind = addTogether.bind.bind(addTogether.bind); 
addTogether.bind = addTogether.bind.bind(addTogether.bind(addTogether)); 
addTogether.bind = addTogether.bind.bind(addTogether); 
addTogether.bind = addTogether.bind(addTogether); 

Мое намерение состоит в том, чтобы позволить этому:

function addTogether(a,b) { 
    return a+b; 
} 

// something here to make the following possible 

console.log(typeof addTogether.bind(2)); // "function" 
console.log(addTogether.bind(2)(3)); // 5 
console.log(addTogether(2,3)); // 5 

ответ

1

Нет, нельзя опустить аргумент контекста на Function.prototype.bind. Вы могли бы, однако, сделать

function addTogether(a,b) { 
    return a+b; 
} 
addTogether_bind = (Function.prototype.bind).bind(addTogether, null); 
//                ^^^^ 
console.log(typeof addTogether_bind(2)); // "function" 
console.log(addTogether_bind(2)(3)); // 5 
console.log(addTogether(2,3)); // 5 
+0

О, дух! Я забыл, что должен был указать два аргумента для '.bind.bind()' –

+0

. Вы понимаете, что можете переключить 'partial' на' bind', и это все равно будет работать. Разве это не значит, что это возможно? Я бы принял это, если вы удалите часть, в которой говорится, что это невозможно. –

+0

@PatrickRoberts: Можно переименовать его в 'bind', да, но это по-прежнему другая функция. Я бы предпочел не перезаписывать свойство '.bind' по тем же причинам, о которых указал Мадара. На самом деле '.partial' даже не является методом, я просто помещал его туда, чтобы присвоить им пространство имен, присвоив его полностью автономной переменной. – Bergi

0

Вы должны были бы изменить Function.prototype, что-то вроде так:

Function.prototype.partiallyApply = function(...args) { 
    return this.bind(null, ...args); 
}; 

Затем вы можете позвонить по телефону

const addTwo = addTogether.partiallyApply(2); 

Вы также можете напрямую изменять .bind() но

  1. Не
  2. Вы должны будете держать старую где-то временно, так что вы можете назвать это
  3. Нет, на самом деле. Не.
+0

Ха-ха, хорошие моменты. Это был лишь один из вопросов «что, если». Я бы никогда не делал этого в производственном коде или что-то в этом роде. Но спасибо за предложение. –