私のコードは次のとおりです。
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
使用できます。call
apply
bind
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
は違うかもしれません。
e
as o.e(fn)
so this
inside e
isを呼び出します。これが意味するo
ことですo.e(...)
(バインドされた関数と関連する複雑さを除いて)。したがって、this
infn.call(this)
はo
and とfn.call(this)
同じ (多かれ少なかれ) になり、コンソールでando.fn = fn; o.fn()
を取得します。ドットが再び表示されていることに注意してください。o
10
fn.call(o)
のようなものですo.fn = fn; o.fn()
3 番目のarguments[0]()
には、隠しドットがそのままp = 'm'; o[p]
(多かれ少なかれ)含まれており、 o.m
so arguments[0]()
is like と同じfn = arguments[0]; arguments.fn = fn; arguments.fn()
です。