この実用的な原則
関数がオブジェクトメソッドと呼ばれる場合、これはこのオブジェクトに割り当てられます。
次のようにコードコードをコピーします。
var parent = {
方法:function(){
console.log(this);
}
};
parent.method();
// <-Parent
この動作は非常に「壊れやすい」ことに注意してください。これはほとんどの開発者を混乱させます。
次のようにコードコードをコピーします。
thisclowncar();
// <-window
これを変更します
.call、.apply、および.bindメソッドを使用して、関数を呼び出す方法を操作して、この値と関数に渡されたパラメーター値を定義するのに役立ちました。
function.prototype.callには、最初のパラメーターが割り当てられ、残りはコール関数に渡されます。
次のようにコードコードをコピーします。
array.prototype.slice.call([1、2、3]、1、2)
// < - [2]
function.prototype.applyは.callに似ていますが、関数に渡されたパラメーターは、パラメーターではなく配列です。
string.prototype.split.apply('13 .12.02 '、['。 ']))
// < - ['13'、 '12'、 '02']
function.prototype.bindは、.bindに渡される値として.bindに渡されるパラメーターを常に使用する特別な関数を作成し、パラメーターの一部を割り当てて元の関数を作成できるカリドバージョンを作成します。
次のようにコードコードをコピーします。
var arr = [1、2];
var add = array.prototype.push.bind(arr、3);
//効果的にarr.pushと同じ(3)
追加 ();
//効果的にarr.pushと同じ(3、4)
追加(4);
console.log(arr);
// < - [1、2、3、3、4]
これはドメインチェーンで
次の例では、これはドメインチェーンでは変更されないようにすることはできません。これはルールの欠陥であり、アマチュア開発者に混乱をもたらすことがよくあります。
次のようにコードコードをコピーします。
関数scoping(){
console.log(this);
return function(){
console.log(this);
};
}
scoping()();
// <-window
// <-window
これへの参照を維持するためにローカル変数を作成する一般的な方法があり、サブアクションドメインに寿命変数はない必要があります。 Sub -Scopeの同じ名前の変数は、親スコアのこれへの参照をカバーします。 http://www.cnblogs.com/sosoft/
次のようにコードコードをコピーします。
関数維持(){
var seelf = this;
return function(){
console.log(self);
};
}
retwing()();
// <-window
いくつかの不可解な理由のために、親の範囲と現在のこの値を実際に使用したい場合を除き、私はメソッドを使用することを好みます。これを使用して、親の範囲を指定してサブスコープを指定できます。
次のようにコードコードをコピーします。
function up(){){)
return function(){
console.log(this);
} .bind(this);
}
壊す () ();
// <-window