-
ν¨μ.prototype.bind(κ°) vs ()⇒{ν¨μ(κ°)} (+thisμ νμ΄νν¨μ)π JavaScript 2023. 2. 20. 15:52
π κ³΅λΆ λ°°κ²½
λ€λ₯Έ λΆμ 리μ‘νΈ μ½λλ₯Ό μ½λ μ€, μνκ°κ³Ό μΈν°ν¨μλ₯Ό νλ‘μΌλ‘ λ°μμ€λ μ½λλ₯Ό μ§ λ€κ³ νμ λ, νμ΄ν ν¨μλ‘ κ°μ λ°μΈλ© μν€λ (2)λ² μ½λμ λμΌνκ² μλνλ (1) λ² μ½λλ₯Ό λ°κ²¬νλ€.
function μ»΄ν¬λνΈ({name, setName}){ return <button onclick={setName.bind(null, "μ‘κ°")}></button> } // -- (1) function μ»΄ν¬λνΈ({name, setName}){ return <button onclick={()=>{setName("μ‘κ°")}}></button> } // --- (2)
μ€νμ€λ²νλ‘μ° μ§λ¬Έλ€μ 보λ κ½€λ 6-7λ λ μ μ ννκ² μ°λ μ½λμκ³ νμ΄ν ν¨μκ° λ±μ₯ν μ§κΈ, λΉλ²ν μ¬μ©λμ§ μλ κ² κ°μ§λ§…
λ μ½λκ° λ체 μ λμΌν κ²μΈμ§ μ΄ν΄νλ κ³Όμ μμ μ‘°κ°μ‘°κ° ν©μ΄μ Έμλ this-bind κ°λ λ€μ΄ νλ°λ‘ λͺ¨μ΄λ κ²½νμ νλ€.
this, νμ΄ν ν¨μ, bind(call, apply)μ λν κ°λ μ΄ λͺ ννμ§ μλ€λ©΄ νλ¨ ‘π this λ?’ μΉμ λΆν° μ½μ΄λ³΄κΈΈ λ°λλ€.
π μ½λ μ€λͺ
onClick μ΄λ²€νΈμ μ λ¬νλ μ΄λ²€νΈ νΈλ€λ¬ ν¨μλ μΌλ° ν¨μλ‘μ¨ this κ°μλ window κ°μ²΄κ° ν λΉλλ€.
<button onClick={function () { console.log(this); // Window κ°μ²΄ }} ></button>
useState (ꡬ쑰 μ°Έκ³ ) μμ μνκ°κ³Ό μΌλ° μΈν° ν¨μλ₯Ό λ°ννλ μ½λκ° λ΄λΆμ μΌλ‘ ꡬνλμ΄μκΈ°μ thisκ°μΌλ‘ window κ°μ²΄κ° λ°μΈλ© λ μνμΌ κ²μ΄λ€.
νμ§λ§... κ³μ νλ¦¬μ§ μλ μλ¬Έμ …
λ©μλμ λ€λ₯Έ κ°μ²΄λ₯Ό κ³ μ μμΌμ£Όκ³ μΆμ λ bindλ₯Ό μ¬μ©νκ³ μΌλ°ν¨μλ μ격λͺ¨λμΌ λ undefinedλ‘ μλ¬΄λ° κ°μ²΄κ° λ°μΈλ© λμ§ μμ ν λ°, μ νν nullμ λ°μΈλ© μμΌμ£Όλ κ±ΈκΉ?
κ·Έμ λν λ΅λ³μ “κΌ nullμΌ νμκ° μλ€”μ΄λ€.
var fn = function (a, b) { console.log(a, b); }; var f1 = fn.bind(null, 'x', 'y'); var f2 = fn.bind({random:"λλ€ κ°μ²΄"}, 'x', 'y'); f1(); // x y f2(); // x y
μ μμ μ²λΌ thisλ₯Ό λ΄λΆμ μΌλ‘ μ¬μ©νμ§ μλ ν¨μμ κ²½μ° μ΄λ ν κ°μ²΄λ₯Ό λ°μΈλ© μμΌμ£Όλ λμΌν κ²°κ³Όλ₯Ό μ»κ²λλ€.
μ΄ μ½λμμ bindκ° μ¬μ©λ μ΄μ μ “μλ‘μ΄ ν¨μλ₯Ό λ°ν”νκ³ , “νμ κ°μ μΈμλ₯Ό λ겨주λλ‘”νλλ‘ νλ λ°μ μλ€.
μ΄ λ§₯λ½μμ 보μμ λ, νμ κ°μ κ²°κ³Ό, μ¦ setName μΈν° ν¨μκ° name μνκ°μ “μ‘κ°”μΌλ‘ μ λ°μ΄νΈμμΌμ£Όλ κ²°κ³Όλ₯Ό μ€νν΄μ£Όλ©΄ λλ μ½λλ‘μ (1), (2)κ° μ¬μ©λμλ€κ³ 보μ¬μ§λ€.
π ν무νμ§λ§ κ·Έλλ ν μ€ μ견
λ€μ μ΄μ΄μ§ λ΄μ©λ€μ 곡λΆν ν, μ΄ν΄ν μ½λλ₯Ό λ°νμΌλ‘ μκΈ΄ ν μ€ μ견μΌλ‘,
(1)λ²λ³΄λ€ (2)λ²μ΄ λ μ’μ μ½λμΈ κ² κ°λ€.
μ μ½λμμ λ¨μν “HOC ν¨μλ₯Ό μ¬μ©ν΄ μ΄ν μΈμλ€μ λκΈ°κΈ° μν μ©λ”λ‘ μ¬μ©λμλ€.
νμ§λ§ bindλ₯Ό μ¬μ©ν λ κ°λ°μλ€μ΄ κΈ°λνλ λΆλΆμ λ°λ‘, κ°μ²΄κ° “λ©μλ”λ‘μ λ°μΈλ©λμ΄μΌ νλ κ²½μ°λΌκ³ μκ°νκΈ° λλ¬Έμ΄λ€.
π this λ?
κ°μ²΄μ μ μ₯λ μ 보λ₯Ό μ κ·Όν μ μκ² ν΄μ£Όλ λ€λ¦¬λΌκ³ μκ°νλ€.
thisλ λ°νμμ κ²°μ λκ³ μ€νλλ μ½ν μ€νΈμ λ°λΌ ν λΉλλ κ°μ΄ λ¬λΌμ§λ€.
λ°λΌμ λμ λ°©μμ μ μ΄ν΄ν΄μΌ μ€μλ₯Ό νΌνκ³ ν¨κ³Όλ₯Ό μμ λ½μ μ¬μ©ν μ μλ€.
μλ μμ μ²λΌ λΉ μ격 λͺ¨λμμλ μ μ μ€μ½νμ main ν¨μλ₯Ό νΈμΆν κ°μ²΄λ window κ°μ²΄κ° ν λΉλκ³ , μ격 λͺ¨λμμλ undefinedμ΄ ν λΉλλ€.
main() ν¨μλ₯Ό νΈμΆν thisκ°μ, μ΄ λ©μλλ₯Ό νΈμΆν κ°μ²΄μΈ ‘μλ’κ° λλ€.
μ΄λ λ― ν¨μλ₯Ό μ§μ μ μΌλ‘ νΈμΆν κ°μ²΄κ° λ°λ‘ thisμ΄κ³ , μ€μ½νμ λ°λΌ λ°μΈλ©λλ thisκ° λ¬λΌμ§ μ μμ. (μ΄λ‘ μΈν΄ λ°μν λ¬Έμ λ λ€μμ μΈκΈν©λλ€).
function main(){ console.log(this); // thisμλ μλ mainν¨μλ₯Ό νΈμΆν κ°μ²΄μΈ window κ°μ²΄κ° λ΄κ²¨μμ } main(); // window.main()μ λμΌ. const μλ = { name: "μλ", main: function(){ console.log(this); // thisμλ ν¨μλ₯Ό νΈμΆν "μλ" κ°μ²΄κ° λ΄κΉ } } μλ.main(); const λΉ μλ = { name: "λΉ μλ", smallYeonny: { // μ€λΈμ νΈ(λΉ μλ) μμ μ€λΈμ νΈ(μ€λͺ°μλ)κ° μλ κ²½μ° name: "μ€λͺ°μλ", function main(){ console.log(this); // thisμλ μ§μ μ μΌλ‘ ν¨μλ₯Ό νΈμΆν "smallYeonny" κ°μ²΄κ° λ΄κΉ } } } λΉ μλ.smallYeonny.main();
μλμ²λΌ μ΄λ²€νΈλ¦¬μ€λ ν¨μμμλ this κ°λ μ΄ μ¬λ±μ₯ν©λλ€.
const button = document.getElementById("btn"); button.addEventListener("click", function(event){ console.log(event.target === this); // μ μ΄λ²€νΈ ν¨μλ₯Ό νΈμΆν κ°μ²΄ buttonμ΄ μΆλ ₯λ©λλ€ })
π thisμ λ¬Έμ μ ?
λ€μ΄λ΄λ―Ή this λ°μΈλ© μ΄μ JSμ thisλ μλ μν©μ λ°λΌ λ€λ₯Έ κ°μ΄ λ°μΈλ©λ μ μμ΅λλ€.
1. μ μ 곡κ°μ this: μ μ κ°μ²΄
2. νΈμΆν μΈμ€ν΄μ€μ λ©μλ λ΄λΆμ this: λ©μλλ₯Ό νΈμΆν κ°μ²΄
3. νΈμΆν μΌλ° ν¨μ λ΄λΆμ this: μ§μ λμ§ μμ → μ§μ λμ§ μλ κ°μ μμ μ€μ½νμμ μ°ΎμΌλ©΄μ μ΅μμ νκ²½μ λλ¬νλ©΄ μ μ κ°μ²΄μΈ thisλ₯Ό λ§μ§λ§μΌλ‘ λ°μΈλ©ν¨.μ μμμ²λΌ thisκ°μ λμ μΌλ‘ λ°λκ³ , μ΄λ₯Ό μνμ§ μκ³ νΉμ λ©μλλ₯Ό νΈμΆν λ νΉμ ν this κ°μ²΄λ₯Ό λ¬Άμ΄μ£Όκ³ μΆμ κ²½μ°λ μμ κ²μ΄λ€.
μ΄ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ 2κ°μ§ λ°©λ²μ΄ μ μλμκ³ , μκ° μμΌλ‘ λ°©λ² 1 → λ°©λ² 2 (ES6)κ° λ±μ₯νμμ΅λλ€.
λ°©λ² 1. bind, call, apply ν¨μλ₯Ό νμ©ν νΉμ κ°μ²΄λ‘ λ°μΈλ©
bind
const μλ = { name: "μλ", main: function(){ console.log(this); }.bind(μλ); }
μ΄λ bindλΌλ HOC ν¨μλ₯Ό νμ©νμ¬ mainλ©μλμ “μλ” κ°μ²΄λ₯Ό λ¬Άμ΄λμ μλ‘μ΄ λ©μλλ₯Ό λ§λ€ μ μλ€.
call
function welcome(){ console.log(this, x,y); } const μλ = { name: "μλ", } welcome.call(μλ, 3,4)
bindμ μ μ¬ν κΈ°λ₯μ νλ ν¨μλ‘ apply, callμ΄ μμ΅λλ€. 첫째 μΈμλ thisμ λ°μΈλ©λκ³ , μ΄ν μΈμλ€μ λ§€κ°λ³μλ‘ μ λ¬λμ΄ μ¦μ μ€νλλ λ©μλμ΄λ€.
apply
function welcome(){ console.log(this, x,y); } const μλ = { name: "μλ", } welcome.apply(μλ, [3,4])
call ν¨μμ λμΌνκ² μ²«μ§Έ μΈμλ thisμ λ°μΈλ©λμ§λ§, μ΄ν μΈμλ€μ΄ 리μ€νΈ ννλ‘ μ λ¬λμ΄ μ¦μ μ€νλλ λ©μλμ΄λ€.
λ°©λ² 2. νμ΄ν ν¨μ νμ©
νμ΄ν ν¨μλ₯Ό μ¬μ©νλ©΄, ν¨μκ° μ μΈλ μμ μμ μμ μ μ€ν μ½ν μ€νΈμ thisκ° μ‘΄μ¬νμ§ μμ λ°λ‘ μμ μ€μ½νμ thisλ‘ λ°μΈλ©λ¨.
λ°λΌμ bind νλ ν¨μλ₯Ό νμ΄ν ν¨μλ‘λ§ λμ²΄ν΄ μ£Όλ©΄ λ¬Έμ ν΄κ²° κ°λ₯.
const κ³ μ κ°μ²΄ = { name: "ν΄λ¨Ό", } const μλ = { name: "μλ", main: () => { console.log(this); // μλ κ°μ²΄ }; }
κ·Έλ λ€λ©΄ νμ΄ν ν¨μλ₯Ό μΈμ μ°λ κ² μ’μκΉ?
λ³κ°μ thisκ° μμ±λλ 건 μνμ§ μκ³ , μΈλΆ μ½ν μ€νΈμ μλ thisλ₯Ό μ¬μ©νκ³ μΆμ κ²½μ° νμ΄ν ν¨μλ₯Ό μ¬μ©ν μ μλ€.
νμ§λ§...!!
μν©μ λ°λΌ thisμ ν λΉλλ κ°μ΄ λ¬λΌμ§ μ μκΈ°μ, μ΄λ€ μν©μ λ°λΌ λ€λ₯Έ κ°μ΄ λ°μΈλ©λλμ§ μ΄ν΄ν¨μΌλ‘μ¨ thisλ₯Ό λ μ μΈ μ μλ€.
1. λμ λ°μΈλ© β οΈ
μΌλ° ν¨μμ κ²½μ° λ©μλλ‘ νΈμΆλλλ / μλλ©΄ ν¨μ μμ²΄λ‘ νΈμΆλλλμ λ°λΌ λμ μΌλ‘ thisκ° λ°μΈλ©λ©λλ€.
1.1. μΌλ° ν¨μλ‘ νΈμΆ
const actor = { name: "μ‘κ°", callName: () => console.log(this.name); } actor.callName() // μμ μ νΈμΆν actor κ°μ²΄κ° μλλΌ, // Window. ν¨μμ€μ½νλ³΄λ€ ν λ¨κ³ μμμ€μ½νμΈ μ μμ€μ½νκ° thisλ‘ λ°μΈλ©.
1.2. λ©μλλ‘ νΈμΆ
var nameCard = { name: "μ‘κ°", addClickEvent: function () { this.element = document.getElementById(this.name); var logName = function () { console.log("Hello! ", this); }; // this.element.addEventListener("click", logName); // this.element μΆλ ₯ this.element.addEventListener("click", logName.bind(this)) // ν΄λΉ μ€νλ¬Έμ this(λ©μλ νΈμΆ κ°μ²΄)λ‘ μ¬λ°μΈλ© μμΌμΌν¨ } }; nameCard.addClickEvent();
1.3. νμ΄ν ν¨μ μ¬μ©
const nameCard = { name: "μ‘κ°", addClickEvent: function () { this.element = document.getElementById(this.name); var logName = () => { // ν¨μκ° μ μΈλ μμ μ μμ μ€μ½νμ thisλ‘ μλ λ°μΈλ© console.log("Hello! ", this.name); }; this.element.addEventListener("click", logName); } }; nameCard.addClickEvent();
μ°Έκ³ μλ£:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Function/bind
'π JavaScript' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
컀μ€ν ν κ³Ό ν¨κ» μ»΄ν¬λνΈμ κ·Έ μ‘°μ λ‘μ§μ μΆμνν΄λ³΄μ! (0) 2023.08.20 리μ‘νΈ μ μ νμ΄μ§ λ°°ν¬ μλ‘ κ³ μΉ¨ 404 μ€λ₯ (0) 2023.08.13 μ°λ¦° μ΄λ»κ² βabcβμ toUpperCaseλ₯Ό μ¬μ©ν μ μμκΉ? (0) 2023.02.28 var μ΄λ μΈ μ λ μκ² λλ°? (1) 2023.02.18 μ νν λ§κ³ λ§μ λ²μ μ€ ES6 μΌκΉ? (2) 2023.02.18