4

私のコードは次のとおりです。

var length = 20;
function fn(){
    console.log(this.length);
}

var o = {
    length:10,
    e:function (fn){
       fn();
       arguments[0]();
    }
}

o.e(fn);

出力は20,1、誰が理由を教えてくれますか?

4

2 に答える 2

6

thisキーワードが関数内にある場合、その値は関数の呼び出し方法によって異なります。

あなたの場合、fn()this 値を指定せずに呼び出されるため、デフォルト値は ですwindow。のarguments[0]()場合、コンテキストはargumentsオブジェクトで、長さは1です。

ポイントは、関数がどこで呼び出されるかは重要ではありませんが、関数がどのように呼び出されるかは重要です。

var length = 20;
function fn(){
    console.log(this.length);
}

var o = {
    length:10,
    e:function (fn){
       fn(); // this will be the window.
       arguments[0](); // this will be arguments object.
    }
}

o.e(fn);

さらにthis、 objectになりたい場合は、 or 、またはobject を最初にo使用できます。callapplybind

var length = 20;
function fn(){
    console.log(this.length);
}

var o = {
    length:10,
    e:function (fn){
       var fn2 = fn.bind(this);
       fn.call(this); // this in fn will be the object o.
       fn.apply(this); // this in fn will be the object o.
       fn2(); // this also will be the object o.
    }
}

o.e(fn);
于 2012-09-03T03:43:04.883 に答える
2

コードを少し拡張しましょう。

var length = 20;
function fn() {
    console.log(this, this.length);
}

var o = {
    length: 10,
    e: function(fn) {
        fn();
        fn.call(this);
        arguments[0]();
    }
}

o.e(fn);​

デモ: http://jsfiddle.net/ambiguous/Ckf2b/

これで、が呼び出されたときに何thisが (したがって、どこthis.lengthから来たのか) を確認できます。fnこれにより、次の出力が得られます。

DOMWindow 0
Object 10
[function fn() { console.log(this, this.length); }] 1

関数を呼び出す方法も 3 つありますfn

  1. fn(): 古い関数と同じように呼び出すだけです。
  2. fn.call(this):call特定のコンテキスト (AKA ) を強制するために使用しますthis
  3. arguments[0]():オブジェクトfnを介して呼び出しargumentsます。

あなたが言うとき、目に見える場所fn()の明示的な値はないthisので、ブラウザではwindowあなたのthis. グローバルwindowにはたまたま次のlengthプロパティがあります。

ウィンドウ内のフレーム (frame または iframe 要素) の数を返します。

それが(私の出力の)ゼロの由来です。あなたwindow.lengthは違うかもしれません。

eas o.e(fn)so thisinside eisを呼び出します。これが意味するoことですo.e(...)(バインドされた関数と関連する複雑さを除いて)。したがって、thisinfn.call(this)oand とfn.call(this)同じ (多かれ少なかれ) になり、コンソールでando.fn = fn; o.fn()を取得します。ドットが再び表示されていることに注意してください。o10

fn.call(o)のようなものですo.fn = fn; o.fn()

3 番目のarguments[0]()には、隠しドットがそのままp = 'm'; o[p](多かれ少なかれ)含まれており、 o.mso arguments[0]()is like と同じfn = arguments[0]; arguments.fn = fn; arguments.fn()です。

于 2012-09-03T04:09:01.520 に答える