私のコードは次のとおりです。
var length = 20;
function fn(){
console.log(this.length);
}
var o = {
length:10,
e:function (fn){
fn();
arguments[0]();
}
}
o.e(fn);
出力は20,1、誰が理由を教えてくれますか?
私のコードは次のとおりです。
var length = 20;
function fn(){
console.log(this.length);
}
var o = {
length:10,
e:function (fn){
fn();
arguments[0]();
}
}
o.e(fn);
出力は20,1、誰が理由を教えてくれますか?
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);
コードを少し拡張しましょう。
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。
fn(): 古い関数と同じように呼び出すだけです。fn.call(this):call特定のコンテキスト (AKA ) を強制するために使用しますthis。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()です。