私はEcmaScript-5 Function.prototype.bindの実装に関するかなり興味深い質問があります。それはクールだのでFunction.prototype.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)だということを理解しています。しかし、実際の生活条件では、それは完全に役に立たない行動ではないのですか?問題はバグですか、機能ですか?それがバグならば、なぜそれが言及されていないのですか?それが機能の場合、ネイティブの「バインド」実装を備えたGoogle Chromeは、まったく同じように動作します。
私の意見では、より理にかなって何を、ここでは異なる少し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();
、...
だからあなたたちはそれについてどう思いますか?
これは機能です。あなたがそれを無効にすることができれば、それは本当に「束縛され」ないだろうか?詳細は仕様書に記載されています:http://ecma262-5.com/ELS5_HTML.htm#Section_15.3.4.5 –
もしそうなら、その機能が既にバインドされているかどうかを判断する方法はありますか?何か?それを再バインドしようとしたときに何も例外をスローしないのはなぜですか?これは、関数がバインドされているかどうか、またはその関数の最初のコピーを処理するかどうかわからないと、デバッグが非常に困難になることです。そのようなことが昨日私に起こった、そして、私は問題の根を見つけるためにほぼ一日を費やしてきた。 – Ruslan
誰もがこの質問に答えるつもりはないと思われる。同じ問題、私はここで見つけることができるworkaroudを作成しました:http://www.angrycoding.com/2011/09/to-bind-or-not-to-bind-that-is-in.html – Ruslan