Ситуация: разрабатывается расширение, в котором явно напрашивается использование некоторых фич JavaScript 1.8.5, особенно - использование bind() в callbacks для передачи контекста. Стандарт JS 1.8.5 вводится начиная с Gecko 2/Fx 4.0. Релиз 4-ки ещё не вышел, да и пользователей более ранних версий даже чисто теоретически не хотелось бы оставлять за бортом. Имеются 2 выхода из ситуации:

1) ручная имплементация bind:

Выделить код

Код:

Function.prototype.bind=function(scope)
{
    var fn=this;
    return function()
    {
        return fn.apply(scope,arguments);
    };
};

2) использование старого костыля а-ля var that=this.

Второй вариант не хочется использовать, потому как это старый костыль, запутывающий код, и плохочитабельный. Сомнения относительно первого варианта базируются на том соображении, что callbacks используются в скриптах браузерного оверлея, и модификация свойств глобальных объектов трудно предсказуема по части поведения других расширений (не говоря уже о том, что требования к разработке однозначно указывают экранировать через namespaces свои программные единицы). В общем, вопрос данного топика - не столько о решении проблемы, сколько о приемлемой методологии решения.

А чем такой способ не нравится?

Выделить код

Код:

if (!Function.bind) {
  Function.prototype.bind = ...
}

Это практически то же, что я выше и привел - просто я для краткости многие нюансы опустил, полная реализация bind() ведь занимает намного больше кода. И, опять же, выше я писал, что именно этот вариант лично меня устраивает более чем - просто хотелось бы знать, насколько подобное внедрение функциональности в глобальные объекты соответствует требованиям к разработке. Ну, допустим, если это попадёт на AMO :)