2

IE8やその他の非ES5ブラウザーをサポートするために、ES5シムではなくunderscore.jsを(悲しいことに)使用する既存のプロジェクトがあります。私はES5に慣れていますが、通常はアンダースコアを使用しません。_.bindのアンダースコアのドキュメントを読み、それを機能させようとしました。

ネイティブES5を使用した実際の例を次に示します。

// Greets people
HelloThing = function (greeting) {
    this.greeting = greeting;

    this.waitAndSayHello = function() {
        setTimeout(function() { 
            console.log(this.greeting)
        }.bind(this), 500);
    }
}


var pretend_thing = new HelloThing('hello world');
pretend_thing.waitAndSayHello();

ドキュメントの理解から、アンダースコアを使用した失敗した試みは次のとおりです。

// Greets people
HelloThing = function (greeting) {
    this.greeting = greeting;

    this.waitAndSayHello = function() {
        var greet = function() { 
            alert(this.greeting)
        }
        _.bind(greet, this)
        setTimeout(greet, 500);
    }
}


var pretend_thing = new HelloThing('hello world');
pretend_thing.waitAndSayHello();​

アンダースコアを機能させるにはどうすればよいですか?

4

1 に答える 1

3

_.bind()メソッドはバインドされた関数を返します。その返された関数では何もしません。それを何かに割り当て、元のgreet参照の代わりにその参照を使用します。

var greet = function() { 
    alert(this.greeting)
};
greet = _.bind(greet, this);
setTimeout(greet, 500);

ES5 の例を展開すると、これが実質的にネイティブ メソッドで起こっていることがわかりますbind。関数オブジェクトは のプロパティであるため、関数オブジェクトを直接呼び出すことができますFunction.prototype

var greet = function() {
    alert(this.greeting);
};
greet = greet.bind(this);
setTimeout(greet, 500);
于 2012-10-30T09:58:05.240 に答える