関数参照の問題
2467 ワード
関数参照
値と参照
JavaScriptには指針がありません.引用の仕組みも違います.JavaScriptでは変数は他の変数への参照にはなりません.JavaScriptは値を参照します.10個の値が参照されている場合、これらの参照は同じ値を指しており、相互間には参照/指向関係がない.JavaScriptは、値と参照の割り当て/伝達は文法的には区別されず、値の種類によって完全に決定される.
伝参にはthisの消失があります.
より微妙で、より一般的で、より意外な場合は、コールバック関数に入る時に発生します.
値と参照
JavaScriptには指針がありません.引用の仕組みも違います.JavaScriptでは変数は他の変数への参照にはなりません.JavaScriptは値を参照します.10個の値が参照されている場合、これらの参照は同じ値を指しており、相互間には参照/指向関係がない.JavaScriptは、値と参照の割り当て/伝達は文法的には区別されず、値の種類によって完全に決定される.
var a = 2;
var b = a; // b a b++;
a; // 2
b; // 3
var c = [1,2,3];
var d = c; // d [1,2,3] d.push( 4 );
c; // [1,2,3,4]
d; // [1,2,3,4]
上記の例では2はスカラーベースの値ですので、変数aはこの値の複本を持っています.bはもう一つの複本を持っています.b変更時、aの値はそのままです.cとdはそれぞれ同じ複合値[1,2,3]の二つの異なる参照を指す.cとdは指向値[1,2,3]だけで、持っていないことに注意してください.したがって、それらが変更されたのは同じ値(例えば、呼び出し・プッシュ(4))であり、その後、それらは変更後の新しい値[1,2,3,4]を指します.参照は変数ではなく値そのものを指すので、他の参照の方向は変更できません.var a = [1,2,3];
var b = a;
a; // [1,2,3]
b; // [1,2,3]
//
b = [4,5,6];
a; // [1,2,3]
b; // [4,5,6]
b=[4,5,6]はa指向値[1,2,3]に影響しません.bが配列の参照ではなく、aを指すポインタである限り、JavaScriptには存在しません.関数パラメータにはしばしばこのような困惑が生じます.function foo(x) {
x.push( 4 );
x; // [1,2,3,4]
//
x = [4,5,6];
x.push( 7 );
x; // [4,5,6,7]
}
var a = [1,2,3];
foo( a );
a; // [1,2,3,4], [4,5,6,7]
私たちは関数にaを渡す時、実際にはaの複素賦値をxに送りますが、aはまだ[1,2,3]を指しています.関数ではxを参照して配列の値を変更してから[1,2,3,4]に変更できます.しかしx=[4,5,6]はaの指向に影響しないので、aは依然として[1,2,3,4]を指す.私たちはxを参照することによって、aとxの共通方向の値を変更することができません.aの値を[4,5,6,7]に変更するには、xに対する新しい配列ではなく、xに対する配列を変更する必要があります.伝参にはthisの消失があります.
function foo() {
console.log( this.a );
}
var obj = {
a: 2,
foo: foo
};
var bar = obj.foo; // !
var a = "oops, global"; // a bar(); // "oops, global"
barはobj.fooの参照ですが、実際にはfoo関数自体を参照していますので、Bar()は実際には何も修飾されていない関数として呼び出されていますので、デフォルトのバインディングが適用されます.より微妙で、より一般的で、より意外な場合は、コールバック関数に入る時に発生します.
var foo = {
bar: function() { return this.baz; },
baz: 1
};
var baz = 2;
(function(fn){
// fn foo
return fn(); //
パラメータ伝達とは、実は一種の暗黙的な賦値であり、したがって、関数に入っても暗黙的に賦課されるので、結果は前の例と同じである.また、thisはダイナミックレンジですので、呼び出し時に決定値を印刷します.var foo = {
bar: function() { alert(baz); },
baz: 1
};
var baz = 2;
(function(fn){
// fn foo
var baz = 3;
return fn(); //
argmentsを使用してパラメータを変えて環境に向けます.
var foo = {
bar: function() { return this.baz; },
baz: 1
};
var baz = 2;
(function(){
arguments.baz = 3;
return arguments[0](); // arguments 。 arguments[0] this arguments。 foo window。
})(foo.bar); // 3