2017-10-05 12 views
1

私はスタンドアロン変数内の特定のオブジェクトからメンバ関数を入れようとしています。新しい変数を使うだけで元のオブジェクト上の関数を呼び出せるようにしたいと考えています。Javascript - オブジェクトのメンバ関数をスタンドアロン変数に入れる?

したがって、このような何か:

var str = "abcdefgh"; 
var fn = str.indexOf; 
console.log(fn("e")); // supposed to output 4 

のでfn(x)str.indexOf(x)と同じ操作を行うことになっています。しかし、これは機能しません。私はこれを取り除くことができる別の方法はありますか?

ここでの難しさは、fnがその特定のstrオブジェクトの関数を呼び出すことです。 だからfnは何らかの閉鎖になるはずです。

答えて

2

You Don't Know JS Seriesから、JSは

  1. は、新しい(新しいバインディング)と呼ばれる機能です。この方法でthisを決定?その場合は、これは新しく作成されたオブジェクト です。

    var bar = new foo()

  2. 機能がさえ はハードバインディングバインドの内側に隠された、コールと呼ばれるか、(明示的な結合)を適用していますか?その場合、これは明示的に指定されたオブジェクト です。

    var bar = foo.call(obj2)

  3. さもなければ が所有として知られているか、またはオブジェクトを含む、(結合暗黙的な)コンテキストと呼ばれる関数はありますか?その場合、これはコンテキスト オブジェクトです。

    var bar = obj1.foo()

  4. そうでない場合は、この(結合デフォルト)デフォルト。 strictモードの場合は が未定義を選択し、そうでない場合はグローバルオブジェクトを選択します。

    var bar = foo()

あなたの問題

あなたはstr.indexOf('e')indexOfを呼び出すと、JSエンジンは、関数のコンテキストのルックアップを開始します。文字列オブジェクトに.表記の関数を呼び出し、そのコンテキストを参照していることがわかります。しかし、 関数の参照を取得してfnのような呼び出しを試みると、エンジンはコンテキストを検索し始め(上記の)、何も見つかりませんでした。それ以外の場合は、その外部の関数参照を取得するとコンテキストが失われます。したがって、明示的にコンテキストを与える必要があります。

ここでは、fnが呼び出されるたびに、関数内のthisstr変数を参照すると書いています。

1

あなたはES6品種はJavaScriptを使用している場合は、これを達成するために、 "矢機能" を使用することができます

var str = "abcdefgh"; 
 
var fn = str.indexOf.bind(str); 
 
console.log(fn("e")); // supposed to output 4

。素敵な短い構文です。さらに参考のため

see the mozilla docs on arrow functions

この変数はもちろん周り渡すことができます。この解法では、変数fnは関数を実行している文字列への直接の参照を保持するので、コンテキストの問題を解決します。

+0

ニース!互換性の理由から私は上記の 'bind()'アプローチを好むでしょうが、これは素晴らしい選択肢です。ありがとう! – RocketNuts

関連する問題