ėĪí ėŧĻí ėĪíļ
this
ėĪí ėŧĻí
ėĪíļë ėĪíí ė―ëė ė ęģĩí íęē― ė ëģīëĪė ëŠĻėëė ę°ėēī
ëĨž ë§íëĪ.
ëėží íęē―ė ėë ė―ëëĪė ėĪíí ë íėí íęē― ė ëģīëĪė ëŠĻė ėŧĻí
ėĪíļëĨž ęĩŽėąíęģ , ėīëĨž ė― ėĪíė ėė ėŽë ļëĪę°, ę°ėĨ ėė ėėŽėë ėŧĻí
ėĪíļė ęīë Ļ ėë ė―ëëĪė ėĪííë ėėžëĄ ė ėēī ė―ëė íęē―ęģž ėėëĨž ëģīėĨíëĪ.
'ëėží íęē―', ėĶ íëė ėĪí ėŧĻí
ėĪíļëĨž ęĩŽėąíë ë°Đëē
ėžëĄ ėëėžëĄ ėėąëë ė ė ęģĩę°ęģž eval() íĻė, íĻė
ę·ļëĶŽęģ ëļëĄ(ES6ėė ėķę°)ėī ėëĪ.
ėĪí ėŧĻí ėĪíļë variableEnvironment, LexicalEnvironment, ThisBindingėīëžë ėļ ę°ė§ ė ëģīëĨž ėė§íëĪ.
ėĪí ėŧĻí
ėĪíļëĨž ėėąí ë varaibleEnvironmentėë íėŽ ėŧĻí
ėĪíļ ëīė ėëģėëĪė ëí ė ëģī(environmentRecord)ė ėļëķ íęē― ė ëģī(outerEnvironmentReference)ę° ëīęļīëĪ.
ëģęē― ėŽíė ë°ėëė§ ėëëĪ.
ėĪí ėŧĻí
ėĪíļëĨž ėėąí ë variableEnvironmentė ė ëģīëĨž ëĻžė ëīė ëĪė, ėīëĨž ę·ļëëĄ ëģĩėŽíī LexicalEnvironmentëĨž ë§ëĪęģ , ėīíėë LexicalEnvironmentëĨž ėĢžëĄ ėīėĐíęē ëëĪ.
ëģęē― ėŽíėī ėĪėę°ėžëĄ ë°ėëëĪ.
environmentRecordėë íėŽ ėŧĻí
ėĪíļė ęīë Ļë ė―ëė ėëģė ė ëģīëĪ(ë§Īę°ëģėëŠ
, ëģėė ėëģė, ė ėļí íĻėė íĻėëŠ
ëą
)ė ėė§íëĪ.
ėīë ė―ëę° ėĪíëęļ° ė ė ėžėīëë ęģžė ėžëĄ ėë°ėĪíŽëĶ―íļ ėė§ė ėĪė ëĄ ė―ëę° ėĪíëęļ° ė ė ėīëŊļ íīëđ íęē―ė ėí ė―ëė ëģėëŠ
ė ëŠĻë ėęģ ėęē ëëĪ.
ėŽęļ°ė íļėīėĪí
ėīë ę°ë
ėī ëąėĨíëĪ.
ėë°ėĪíŽëĶ―íļ ėė§ė ėëģėëĪė ėĩėëĻėžëĄ ëėīėŽë Īëė ëĪė ėĪė ė―ëëĨž ėĪííë ęēėīëĪ.
ë§Īę°ëģėė ëģėė ëí íļėīėĪí
environmentRecordë íėŽ ėĪíë ėŧĻí
ėĪíļė ëė ė―ë ëīė ėīëĪ ėëģėëĪėī ėëė§ėë§ ęīėŽėī ėęģ , ę° ėëģėė ėīëĪ ę°ėī í ëđë ęēėļė§ë ęīėŽėī ėëĪ.
ë°ëžė, ëģėëĨž íļėīėĪí
í ë ëģėëŠ
ë§ ëėīėŽëĶŽęģ , í ëđ ęģžė ė ėë ėëĶŽė ę·ļëëĄ ëĻęēĻëëĪ.
íĻė ė ėļė íļėīėĪí
ëģėë ė ėļëķė í ëđëķëĨž ëëėī ė ėļëķë§ ëėīėŽëĶŽë ë°ëĐī, íĻė 'ė ėļ'ė íĻė ė ėēīëĨž ëėīėŽëĶ°ëĪ.
íĻė ė ėļëŽļęģž íĻė ííė
console.log(sum(1, 2));
console.log(multiply(3, 4));
// íĻė ė ėļëŽļ
function sum (a, b) {
return a + b;
}
// íĻė ííė
var multiply = function (a, b) {
return a * b;
}
íĻė ííėėīë íĻėëĨž ëĪëĨļ ëģėė ę°ėžëĄėĻ í ëđí ęēė ë§íëĪ.
íĻė ė ėļëŽļęģž íĻė ííėė íļėīėĪí
ė ėėī ę·đëŠ
í ė°Ļėīė ė ę°ė§ëĪ.
íļėīėĪí
ė ë§ėđ ėíëĨž ėėëĄ ė―ëëĄėĻ íííëĐī ëĪėęģž ę°ëĪ.
var sum = function sum (a, b) { // (íĻė ė ėļëŽļ) íĻė ė ėļëŽļ ė ėēīëĨž íļėīėĪí
return a + b;
}
var multiply; // (íĻė ííė) ëģė ė ėļëķ(íĻėëĨž í ëđí ëģėëŠ
)ë§ė íļėīėĪí
console.log(sum(1, 2));
console.log(multiply(3, 4));
multiply =function (a, b) { // (íĻė ííė) ëģė í ëđëķë ėë ėëĶŽė ëĻęēĻë
return a * b;
}
ë°ëžė, multiply(3, 4)ëĨž ėķë Ĩíęģ ė í ë ëģė multiplyėë ėė§ íĻėę° í ëđëęļ° ė ėīëŊëĄ 'multiply is not a function'ėīëžë ėëŽę° ëŽëĪ.
cf. ėëė ėžëĄ íĻė ė ėļëŽļëģīëĪ íĻė ííėė ėŽėĐíë ęēėī ėė íëĪ. íĻė ė ėļëŽļė íĩė§ļëĄ íļėīėĪí ëęļ° ëëŽļė ëŽļė ę° ėęļļ íëĨ ėī ëė ë°ëĐī, íĻė ííėė ėŽėĐíëĐī ëģėëŠ ë§ íļėīėĪí ëęļ° ëëŽļė ëģėė íĻėę° í ëđëęļ° ė ė íĻėëĨž ėĪííëĐī ėëŽëĨž ëėėĪėžëĄėĻ ë í° ížëė ë°Đė§í ė ėëĪ.
ėĪė―íë ėëģėė ëí ė íĻëēė
ëĨž ë§íëĪ.
ES5ęđė§ė ėë°ėĪíŽëĶ―íļë ė ė ęģĩę°ė ė ėļíëĐī ėĪė§ íĻėė ėíīėë§ ėĪė―íę° ėėą
ëëĪ.
(ES6ėėë ëļëĄė ėíīėë ėĪė―í ęē―ęģę° ë°ėíëĪ.)
ėĪė―í ėēīėļėīë ėëģėė ė íĻëēėëĨž ėėėëķí° ë°ęđĨėžëĄ ė°ĻëĄëĄ ęēė
íīëę°ë ęēė ë§íëĪ.
ėīëĨž ę°ëĨėž íë ęēėī LexicalEnvironmentė ë ëēė§ļ ėė§ ėëĢėļ outerEnvironmentReferenceėīëĪ.
(ėēŦ ëēė§ļ ėė§ ėëĢ: environmentRecord / ë ëēė§ļ ėė§ ėëĢ: outerEnvironmentReference)
var a = 1;
var outer = function () {
var inner = function () {
console.log(a);
var a = 3;
};
inner();
console.log(a);
};
outer();
console.log(a);
outerEnvironmentReferenceë íėŽ íļėķë íĻėę° ė ėļë ëđė
ė LexicalEnvironment(ėĶ, ë°ëĄ ė§ė ėŧĻí
ėĪíļė LexicalEnvironment)ëĨž ė°ļėĄ°íëĪ.
- ė ė ėŧĻí ėĪíļ ėëėžëĄ ėėą
ė ė ėŧĻí ėĪíļė L.E
e: { a, outer } (ė ė ėŧĻí ėĪíļë ė ėļ ėė ėī ë°ëĄ ėęļ° ëëŽļė outerEnvironmentReferenceë ėęģ environmentRecordë§ ėëĪ.)
- outer() íĻė ėĪí ė outer ėĪí ėŧĻí ėĪíļ íėąí
outer ėĪí ėŧĻí ėĪíļė L.E
e: { inner }
o: GLOBAL L.E ( = outer() íĻėę° ė ėļë ëđėė L.E )
- inner() íĻė ėĪí ė inner ėĪí ėŧĻí ėĪíļ íėąí
inner ėĪí ėŧĻí ėĪíļė L.E
e: { a }
o: outer L.E ( = inner() íĻėę° ė ėļë ëđėė L.E )
ë°ëžė, ėīėēëž ėŽëŽ ėĪė―íėė ëėží ėëģėëĨž ė ėļí ęē―ė°ėë ëŽīėĄ°ęąī ėĪė―í ėēīėļ ėėė ę°ėĨ ëĻžė ë°ęēŽë ėëģėėë§ ė ę·žėī ę°ëĨ
íëĪ.
ėĪė―í ėēīėļ ėė ėīëĪ ėĪė―íė LexicalEnvironmentė ė°ūë ėëģėę° ėĄīėŽíëĪëĐī ë ėīė ėĪė―í ėēīėļ ęēėė ė§ííė§ ėęģ ė°ūė ėëģėė ę°ė ë°ííęē ëëĪ.
ėĶ, ėė ėĪė―íė LexicalEnvironmentė ę°ė ėëģėę° ėĄīėŽíëëžë ė ę·ží ė ėëĪ.
ėīëĨž ëģė ėëí
ëžęģ íëĪ.
ėīë ė ė ėŧĻí ėĪíļė LexicalEnvironmentė ëīęļī ëģėëĨž ė ėëģėëžęģ íęģ , ę·ļ ë°ė íĻėė ėíī ėėąë ėĪí ėŧĻí ėĪíļė ëģėëĪė ė§ėëģėëžęģ íëĪ.
ë§ė§ë§ėžëĄ, ėĪí ėŧĻí
ėĪíļė thisBindingėë thisëĄ ė§ė ë ę°ėēīę° ė ėĨëëĪ.
thisë ėĪí ėŧĻí
ėĪíļ íėąí ëđėė ė§ė ëęģ , íĻėëĨž íļėķíë ë°Đëēė ë°ëž ę·ļ ę°ėī ëŽëžė§ëĪ.
ë§ė― ėĪí ėŧĻí
ėĪíļ íėąí ëđėė thisę° ė§ė ëė§ ėėëĪëĐī, thisėë ė ė ę°ėēīę° ė ėĨëëĪ.
ëëķëķė ę°ėēīė§íĨ ėļėīėė thisë íīëėĪëĄ ėėąí ėļėĪíīėĪ ę°ėēīëĨž ėëŊļíëĪ.
ę·ļëŽë, ėë°ėĪíŽëĶ―íļėėė thisë ėīëėë ėŽėĐí ė ėėī ížëė ėžęļ°íëĪ.
ėë°ėĪíŽëĶ―íļėė thisë ęļ°ëģļė ėžëĄ ėĪí ėŧĻí
ėĪíļę° ėėąë ë(ėĶ, íĻėę° íļėķë ë)
ęē°ė ëëĪ.
íĻėëĨž ėīëĪ ë°ĐėėžëĄ íļėķíëëė ë°ëž ę·ļ ę°ėī ëŽëžė§ëĪ.
ė ė ęģĩę°ėėė thisë ė ė ę°ėēī
(ëļëžė°ė ėėë window, Node.jsėėë global)ė ę°ëĶŽíĻëĪ.
cf. ė ė ëģėė ė ė ę°ėēīė íëĄíží°
ė ė ëģėëĨž ė ėļíëĐī, ėë°ėĪíŽëĶ―íļ ėė§ė ėīëĨž ė ė ę°ėēīė íëĄíží°ëĄ í ëđíëĪ.
ėŽėĪ ėë°ėĪíŽëĶ―íļė ëŠĻë ëģėë íđė ę°ėēīė íëĄíží°ëĄė ëėíëĪ.
ėīë íđė ę°ėēīë ėĪí ėŧĻí ėĪíļė LexicalEnvironmentëĨž ë§íëĪ.ë°ëžė, ëëķëķė ęē―ė° ė ė ėŧĻí ėĪíļėėë varëĄ ëģėëĨž ė ėļíë ęēęģž windowė íëĄíží°ė ė§ė í ëđíë ęēė ëę°ėī ëėíëĪ.
ę·ļëŽë, ę°ėēīė íëĄíží°ëĨž ė ęą°íë 'delete ė°ė°ė'ë ė ėė ęē―ė°ėë ė ëëĄ ėëíė§ ėëëĪ.
ė ė ëģėëĨž ė ėļíëĐī ėë°ėĪíŽëĶ―íļ ėė§ėī ėīëĨž ėëėžëĄ ė ė ę°ėēīė íëĄíží°ëĄ í ëđíė§ë§, ėķę°ëĄ íīëđ íëĄíží°ė configurable ėėą(ëģęē― ë° ėė ę°ëĨėą)ė falseëĄ ė ėíęļ° ëëŽļėīëĪ.console.log(window.c, this.c, c); // c is not defined window.c = 3; console.log(window.c, this.c, c); // 3 3 3
var c = 3; delete c; // íđė delete window.c; console.log(c, window.c, this.c); // 3 3 3 (delete ė°ė°ėę° ėë x)
ė ëĶŽíėëĐī, varëĄ ė ėļí ė ė ëģėė ė ė ę°ėēīė íëĄíží°ë
íļėīėĪí ėŽëķ ë° configurable ėŽëķ
ėė ė°ĻėīëĨž ëģīėļëĪęģ í ė ėëĪ.
ëĐėë ëīëķėėė thisë ëĐėë íļėķ ėĢžėēī
(ëĐėëëŠ
ėė ę°ėēī)ëĨž ę°ëĶŽíĻëĪ.
íĻė ëīëķėėė this
ęē°ëĄ ëķí° ë§íėëĐī, íĻė ëīëķėėė thisë ė ė ę°ėēī
ëĨž ę°ëĶŽíĻëĪ.
ėėė thisë ëĐėëë íĻėëĨž íļėķí ėĢžėēīëĨž ę°ëĶŽíĻëĪęģ íëĪ.
ę·ļë°ë° ëĐėëė ëŽëĶŽ íĻėëĄė íļėķíë ęēė íļėķ ėĢžėēīëĨž ëŠ
ėíė§ ėęģ ę°ë°ėę° ė―ëė ė§ė ęīėŽíīė ėĪíí ęēėīęļ° ëëŽļė íļėķ ėĢžėēīė ė ëģīëĨž ė ė ėëĪ.
ėė ėĪí ėŧĻí
ėĪíļëĨž íėąíí ë(ėĶ, íĻėëĨž ėĪíí ë) thisę° ė§ė ëė§ ėė ęē―ė° thisë ė ė ę°ėēīëĨž ę°ëĶŽíĻëĪęģ íėžëŊëĄ, íĻė ëīëķėėė thisë ė ė ę°ėēīëĨž ę°ëĶŽíĪęē ëë ęēėīëĪ.
ëĐėëė ëīëķ íĻėėėė this
í·ę°ëĶŽęļ° ė―ė§ë§ íëë§ ėëĐī ëëĪ.
ëĐėëė ëīëķ íĻėëĨž íĻėëĄė íļėķíëė§, ëĐėëëĄė íļėķíëė§ë§ íė
íëĐī this ę°ė ė íí ë§ėķ ė ėëĪ.
ėĶ, this ë°ėļëĐė ėėī íĻėëĨž ėĪííë ëđėė ėĢžëģ íęē―ė ėĪėíė§ ėęģ , ėĪė§ íīëđ íĻėëĨž íļėķíë ęĩŽëŽļ ėė ė ëë ëęīíļ íęļ°ę° ėëė§ę° ęīęąīėīëžęģ í ė ėëĪ.
cf. íĻėę° ėĪíë ë ėĪí ėŧĻí ėĪíļę° ėėąëëĐīė
íļėīėĪí , ėĪė―í ėēīėļ ėė§, this ë°ėļëĐ
ëąė ėííëĪ.
ę·ļë°ë° ėīë ęē íëĐī thisė ëí ęĩŽëķė ëŠ
íí í ė ėė§ë§, thisëžë ëĻėīę° ėĢžë ėļėęģžë ëŽëžė ļ ëēë ļëĪ.
íļėķ ėĢžėēīę° ėė ë ėëėžëĄ ė ė ę°ėēīëĨž ë°ėļëĐíęļ°ëģīëĻ, íļėķ ëđė ėĢžëģ íęē―ė thisëĨž ę·ļëëĄ ėėë°ė ėŽėĐí ė ėëĪëĐī ë ėĒė ęēėīëĪ.
ðĄ ëĐėëė ëīëķ íĻėėėė thisëĨž ė°ííë ë°Đëē
ES5ęđė§ë ėėēīė ėžëĄ ëīëķ íĻėė thisëĨž ėėí ë°Đëēė ėëĪ.
ëĪë§, ëģėė ėė ėĪė―íė thisëĨž ė ėĨíīė ėīëĨž ëīëķ íĻėėė íėĐíë ėėžëĄ thisëĨž ė°íí ė ėëĪ.
var obj = {
outer: function () {
console.log(this); // obj
var innerFunc1 = function () {
console.log(this); // window
};
innerFunc1();
var self = this; // outer íĻėę° íļėķë ëđėė íļėķ ėĢžėēī = obj ( âĩ obj.outer(); )
var innerFunc2 = function () {
console.log(self); // obj
};
innerFunc2();
}
};
obj.outer();
ėīë°ėë call / apply / bind ëĐėë ëąė ėŽėĐíë ë°Đëēėī ėëĪ. ėīëĪė ëĪėė ėīíīëģž ęēėīëĪ.
ðĄ íėīí íĻė: thisëĨž ë°ėļëĐíė§ ėë íĻė
ííļ, ES6ėėë íĻė ëīëķėė thisę° ė ė ę°ėēīëĨž ę°ëĶŽíĪë ëŽļė ëĨž ëģīėíęģ ė íėīí íĻėëĨž ėīėĐí ė ėëĪ.
íėīí íĻėë ėĪí ėŧĻí
ėĪíļëĨž ėėąí ë ėė thisëĨž ë°ėļëĐíė§ ėęļ° ëëŽļė íėīí íĻė ëīëķėë thisę° ėė ėėī ėīė ė ę·žíë ĪëĐī ėĪė―íėēīėļė ę°ėĨ ę°ęđėī thisė ė ę·žíęē ëëĪ.
setTimeout(function () { console.log(this) }, 300); // window
[1, 2, 3, 4, 5].forEach(function (x) {
console.log(this, x); // window
});
// addEventListenerë ėėēīė ėžëĄ ė―ë°ą íĻėëĨž íļėķí ë ėė ė thisëĨž ėėíëëĄ ė ėëėī ėëĪ
document.querySelector("button").addEventListener("click", function () {
console.log(this); // <button>ëēíž</button>
});
ė―ë°ą íĻėėėė thisë íīëđ ė―ë°ą íĻėė ė ėīęķė ëęēĻë°ė íĻė
(setTimeout, forEach, addEventListener ëą)ę° ė ėí ë°ė ë°ëĨīëĐ°
, ė ėíė§ ėė ęē―ė°ėë ė―ë°ą íĻė ëí íĻėëĄė íļėķíë ęēėīęļ° ëëŽļė ė ė ę°ėēīëĨž ę°ëĶŽíĪęē ëëĪ.
ėėąė íĻė ëīëķėėė thisë ėėąėė ėíī ęģ§ ėëĄ ë§ëĪėīė§ ę°ėēī, ėĶ ėļėĪíīėĪ
ę° ëëĪ.
cf. ėėąė íĻėë ėīëĪ ęģĩíĩë ėąė§ė ė§ëë ę°ėēīëĪė ėėąíë ë° ėŽėĐíë íĻėėīëĪ.
ę°ėēīė§íĨ ėļėīėėë ėėąėëĨž íīëėĪ, íīëėĪëĨž íĩíī ë§ë ę°ėēīëĨž ėļėĪíīėĪëžęģ íëĪ.
call ëĐėëë íīëđ ëĐėëė íļėķ ėĢžėēīėļ íĻėëĨž ėĶė ėĪííëëĄ íë ëŠ
ë đėīëĪ.
call ëĐėëė ėēŦ ëēė§ļ ėļėëĨž thisëĄ ë°ėļëĐíęģ , ėīíė ėļėëĪė íļėķí íĻėė ë§Īę°ëģėëĄ íëĪ.
apply ëĐėë ëí call ëĐėëė ęļ°ëĨė ėžëĄ ėė í ëėžíëĪ.
ëĪë§, apply ëĐėëë call ëĐėëė ëŽëĶŽ ë ëēė§ļ ėļėëĨž 'ë°°ėī'ëĄ ë°ė ę·ļ ë°°ėīė ėėëĪė íļėķí íĻėė ë§Īę°ëģėëĄ ė§ė íëĪë ė ėė ė°Ļėīę° ėëĪ.
ė ėŽë°°ėīę°ėēīė ë°°ėī ëĐėëëĨž ė ėĐ
ė ėŽë°°ėīę°ėēīë â ë°°ėīė ęĩŽėĄ°ė ė ėŽí ę°ėēī, ėĶ íĪę° 0 ëë ėė ė ėėļ íëĄíží°ę° ėĄīėŽíęģ length íëĄíží°ė ę°ėī 0 ëë ėė ė ėėļ ę°ėēīëĨž ë§íëĪ.
⥠íĻė ëīëķėė ė ę·ží ė ėë arguments ę°ėēīë âĒ querySelectorAll, getElementsByClassName ëąė Node ė íėëĄ ė íí ęē°ęģžėļ NodeListë ė ėŽë°°ėīę°ėēīė íīëđëëĪ.
var str = "abc def";
var newArr = Array.prototype.map.call(str, function(char) { return char + "!"; });
console.log(newArr); // [ "a!", "b!", "c!", "!", "d!", "e!", "f!" ]
ëí, âĢ ë°°ėīėēëž ėļëąėĪė length íëĄíží°ëĨž ę°ė§ë ëŽļėėīė ëíīėë ë°°ėī ëĐėëëĨž ė ėĐí ė ėëĪ.
ëĪë§, ėī ęē―ė°ėë ėëģļ ëŽļėėīė ëģęē―ė ę°íë ëĐėëë ė ėĐí ė ėëĪ.
ę·ļë°ë° ėŽėĪ call/applyëĨž ėīėĐíī íëģíė íë ęēė 'thisëĨž ėíë ę°ėžëĄ ė§ė íīė íļėķíëĪ'ëžë ëģļë ëĐėëė ėëėë ëĪė ëëĻėīė§ íėĐëēėīëžęģ í ė ėëĪ.
ėīė ES6ėėë ė ėŽë°°ėīę°ėēī ëë ėí ę°ëĨí ëŠĻë ėĒ
ëĨė ë°ėīí° íė
ė ë°°ėīëĄ ė ííë Array.from() ëĐėëëĨž ëė
íëĪ.
ėėąė ëīëķėė ëĪëĨļ ėėąėëĨž íļėķ
function Person(name, gender) {
this.name = name;
this.gender = gender;
}
function Student(name, gender, school) {
Person.call(this, name, gender); // thisë 'syong'ëĨž ę°ëĶŽíĻëĪ
this.school = school;
}
var syong = new Student("ė", "female", "ëíęĩ");
ėėąė íĻė ëīëķėė ëĪëĨļ ėėąė íĻėëĨž íļėķíėŽ ėļėĪíīėĪė ėėąė ė ėíĻėžëĄėĻ ë°ëģĩė ėĪėž ė ėëĪ.
ėŽëŽ ėļėëĨž ëŽķėī íëė ë°°ėīëĄ ė ëŽíęģ ėķė ë - apply íėĐ
var numbers = [10, 20, 3, 16, 45];
var max = Math.max.apply(null, numbers);
console.log(max); // 45
ėŽëŽ ę°ė ėļėëĨž ë°ë ëĐėëė, íëė ë°°ėīëĄ ėļėëĪė ė ëŽíęģ ėķė ë, apply ëĐėëëĨž íėĐí ė ėëĪ.
bind ëĐėëë call ëĐėëė ëđė·íė§ë§ íīëđ ëĐėëė íļėķ ėĢžėēīėļ íĻėëĨž ėĶė íļėķíė§ë ėęģ
ëęēĻ ë°ė this ë° ėļėëĪė ë°íėžëĄ ėëĄėī íĻėëĨž ë°ííëĪ.
ėīë thisëĨž ė§ė
í ëŋ ėëëž ëķëķ ė ėĐ íĻėëĨž ęĩŽí
íęļ° ėíīėë ėŽėĐëëĪ.
name íëĄíží°
call/apply ëĐėëë ëŠ
ėė ėžëĄ ëģëė thisëĨž ë°ėļëĐíë ë°Đëēėīė§ë§ ėĪíë Ī ėīëĄ ėļíī thisëĨž ėėļĄíęļ° ėīë ĩęē ë§ëĪęļ°ë íëĪ.
ë°ëĐī, bind ëĐėëė ėíī ë°íë íĻėė name íëĄíží°ėë 'bound'ëžë ė ëėīę° ëķėī callėīë apply ëĐėëëĨž ėŽėĐíë ęēëģīëĪ ė―ëëĨž ėķė íęļ°ę° ė―ëĪë ėĨė ėī ėëĪ.
ðĄ ėė ėŧĻí ėĪíļė thisëĨž ëīëķ íĻėë ė―ë°ą íĻėė ė ëŽíęļ°
var obj = {
outer: function () {
console.log(this); // obj
var innerFunc = function () {
console.log(this); // ėëë windowė§ë§ call ëĐėëė ėíī obję° ëĻ
};
innerFunc.call(this);
}
};
obj.outer();
var obj = {
outer: function () {
console.log(this); // obj
var innerFunc = function () {
console.log(this); // ėëë windowė§ë§ bind ëĐėëė ėíī obję° ëĻ
}.bind(this);
innerFunc();
},
};
obj.outer();
var obj = {
logThis: function () {
console.log(this);
},
logThisLater1: function () {
// console.log(this); // ėŽęļ°ė thisë obj ( âĩ obj.logThisLater1(); )
setTimeout(this.logThis, 500); // ë°ëžė, ėŽęļ°ė thisë obj
},
logThisLater2: function () {
setTimeout(this.logThis.bind(this), 1000); // ėŽęļ°ė thisë obj
// â ė―ë°ą íĻėëĄ ę°ėēīė ëĐėëëĨž ė ëŽíëëžë ė―ë°ą íĻė ëí íĻėėīęļ° ëëŽļė
// thisëĨž ë°ëĄ ë°ėļëĐíīėĢžė§ ėėžëĐī 'ė―ë°ą íĻė ëīëķėėė this'ë ėë ė ė ę°ėēīëĨž ę°ëĶŽíĻëĪ.
// bind ëĐėëëĨž ėīėĐíī objëĨž ė―ë°ą íĻė ëīëķėėė thisëĄ ë°ėļëĐíīėĪŽëĪ.
// ėĢžė! this.logThisėėė thisë objėīëĪ. ę·ļëŽë ėīë ė―ë°ą íĻė ëīëķėėė thisėë ėíĨė ëŊļėđė§ ėëëĪ.
// bind(this)ëĨž íĩíī ė―ë°ą íĻė ëīëķėėė thisę° obję° ëë ęēėīëĪ.
}
};
obj.logThisLater1(); // window
obj.logThisLater2(); // ėëë windowė§ë§ bind ëĐėëė ėíī obję° ëĻ
ėėëĨž ėííëĐīė ė―ë°ą íĻėëĨž ë°ëģĩ íļėķíë ëīėĐė ėžëķ ëĐėëë, ëģëė ėļėëĄ thisëĨž ë°ęļ°ë íëĪ.
ė―ë°ą íĻė
ė íĻęŧ thisëĄ ė§ė í ę°ėēī(thisArg)
ëĨž ėļėëĄ íĻęŧ ë°ë ęēėīëĪ.
var report = {
sum: 0,
count: 0,
add: function () {
// console.log(this); // 1. ėŽęļ°ė thisë report ( âĩ report.add(60, 85, 95); )
var args = Array.prototype.slice.call(arguments);
args.forEach(function (entry) {
this.sum += entry; // 3. ėë ė―ë°ą íĻėë íĻėėīëŊëĄ ė―ë°ą íĻė ëīëķė thisë windowė§ë§, '2'ė ėíī reportę° ëĻ
++this.count;
}, this); // 2. ë°ëžė, ėŽęļ°ė thisë report
},
average: function () {
return this.sum / this.count; // ėŽęļ° thisë '1'ęģž ę°ė ë§Ĩë―ėė report
}
};
report.add(60, 85, 95);
console.log(report.sum, report.count, report.average()); // 240 3 80