JavaScriptの中でthisの指す修正
2824 ワード
JavaScriptでthisが指す原理を紹介しましたが、今日はthisが指すいくつかの複雑な解析と、どのようにthisの方向を変えるかを紹介します.
thisの指向については、いくつかの点に注意が必要です. thisが指すのは、対象だけです. thisは、作成時に決定されるのではなく、関数の実行環境に依存します. 匿名関数の実行環境は、大域的である. は、一般的な関数の呼び出しに対して、thisをnull にバインドしています.
一、this問題
一つ挙げますか
クローズドの作成方法によっては、thisの指向性が問題になり、発見されにくい場合があります.もう一つ
二、thisの向きを変えるにより、that変数を定義し、thisを取得する .
二つ目の修復 appy applyは2つのパラメータを受信し、最初のパラメータは結合を必要とするthis変数であり、2番目のパラメータはArayであり、関数自体のパラメータを表している.最初の修復コール callはappyと同様に、唯一の違いは、 bind 関数のbindはオブジェクトを指定して、このオブジェクトにthisをバインドします.bindで最初の修復?
矢印関数によって,this指向混迷問題が解決された.thisオブジェクトの指向は可変ですが、矢印関数では固定されています.矢印関数には重要な特性があります.関数内のthisオブジェクトは定義時のオブジェクトです.使用時のオブジェクトではなく、下の理由を説明します.thisがないからこそ、コンストラクタとしては使えません.二つ目の修復
thisの指向については、いくつかの点に注意が必要です.
一、this問題
一つ挙げますか
function getAge() {
var y = new Date().getFullYear();
return y - this.birth;
}
const xiaoming = {
name: ' ',
birth: 1990,
age: getAge
};
xiaoming.age(); // 29,
getAge(); // NaN
this指向関数が呼び出されたオブジェクト(実行環境).これは巨大な設計ミスであるため、ECMAは、strictモードで関数のthisをundefinedに向けるように規定している.上ですかstrictモードでgetAge()
を呼び出すと、エラーが発生します.この決定はエラーを直ちに暴露させるだけで、thisが指すべき正しい位置を解決していません.クローズドの作成方法によっては、thisの指向性が問題になり、発見されにくい場合があります.もう一つ
const name = 'this window'
const obj = {
name : 'my object',
getName : function(){
function getNameFunc(){
return this.name
}
return getNameFunc()
}
}
obj.getName() //undefined
getNameFunc
は匿名関数で実行され、匿名関数の実行環境は大域的であり、thisはまたwindowを指す.二、thisの向きを変える
二つ目の修復
const name = 'this window'
const obj = {
name : 'my object',
getName : function(){
const that = this; //that this obj
function getNameFunc(){
return that.name
}
return getNameFunc()
}
}
obj.getName() //my object
関数自体のappy、call、bindを呼び出して、関数のthisがどのオブジェクトを指すかを指定できます.function getAge() {
const y = new Date().getFullYear();
return y - this.birth;
}
const xiaoming = {
name: ' ',
birth: 1990,
age: getAge
};
xiaoming.age(); // 29,
getAge.apply(xiaoming,[]); // 29,
apply()
がパラメータをArayにカプセル化して入ってきたのに対し、call()
はパラメータを順番に入力したことである.function getAge() {
const y = new Date().getFullYear();
return y - this.birth;
}
const xiaoming = {
name: ' ',
birth: 1990,
age: getAge
};
xiaoming.age(); // 29,
getAge.bind(xiaoming)() //29,
三、矢印関数(ES 6)矢印関数によって,this指向混迷問題が解決された.thisオブジェクトの指向は可変ですが、矢印関数では固定されています.矢印関数には重要な特性があります.関数内のthisオブジェクトは定義時のオブジェクトです.使用時のオブジェクトではなく、下の理由を説明します.thisがないからこそ、コンストラクタとしては使えません.二つ目の修復
const name = 'this window'
const obj = {
name : 'my object',
getName : function(){
const getNameFunc = ()=> {
return this.name
}
return getNameFunc()
}
}
obj.getName() //my object
転載はソースを明記してください.sherrybabyのブログです.