EcmaScript-5Function.prototype.bindの実装について非常に興味深い質問があります。通常、bindを使用する場合は、次のようにします。
var myFunction = function() {
alert(this);
}.bind(123);
// will alert 123
myFunction();
かっこいいですが、これを行うとどうなるでしょうか。
// rebind binded function
myFunction = myFunction.bind('foobar');
// will alert... 123!
myFunction();
Function.prototype.bindの実装方法に関しては完全に論理的な動作であることを理解しています(https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind)。しかし、実際の状況では、それは完全に役に立たない行動ですよね?問題は、それがバグなのか機能なのかということです。それがバグなら、なぜそれはどこにも言及されていないのですか?それが機能である場合、ネイティブの「バインド」実装を備えたGoogleChromeがまったく同じように動作するのはなぜですか。
より明確にするために、私の意見ではもっと理にかなっていることですが、Function.prototype.bindを少し異なる方法で実装するコードスニペットを次に示します。
if (!Function.prototype.bind) {
Function.prototype.bind = function() {
var funcObj = this;
var original = funcObj;
var extraArgs = Array.prototype.slice.call(arguments);
var thisObj = extraArgs.shift();
var func = function() {
var thatObj = thisObj;
return original.apply(thatObj, extraArgs.concat(
Array.prototype.slice.call(
arguments, extraArgs.length
)
));
};
func.bind = function() {
var args = Array.prototype.slice.call(arguments);
return Function.prototype.bind.apply(funcObj, args);
}
return func;
};
}
だから今これを試してみてください:
// rebind binded function
myFunction = myFunction.bind('foobar');
// will alert... "foobar"
myFunction();
私の意見では、「これ」を置き換える方が理にかなっています...
それで、皆さんはそれについてどう思いますか?