Smart Contract Developer, Web3 Backend Developer
Smart Contract Developer, Web3 Backend Developer

Subscribe to Primrose

Subscribe to Primrose
<100 subscribers
<100 subscribers
Share Dialog
Share Dialog
Gas optimization in Solidity, Ethereum
Iβm sorry but my English is terrible. I hope you understand that generously.Recently, I was developing a toy project named Blind Market. Itβs a simple P2P trading application using smart contract. I was making a contract using Solidity, and the trade stage proceeded in the order of pending, shipping, and done. The problem was appeared in done phase. The problem was that when I tried to close the transaction by paying the price raised by the seller in msg.value, the following error occurred.Pe...
Uvicorn & Gunicorn
Uvicorn and GunicornUvicorn and Gunicorn are important concepts when developing applications in Python. However, there are many concepts to be aware of in order to fully understand Uvicorn and Gunicorn. The following is a brief summary of the necessary concepts, and the details will be dealt with separately later.Necessary ConceptsStarletteStarlette is a Web application server that can run asynchronously. Starlette runs on top of Uvicorn.FastAPIFastAPI provides many features on top of Starlet...
P2WPKH
P2WPKHP2WPKHλ λΉνΈμ½μΈ λ΄μμ κ°μ₯ μΌλ°μ μΈ μ€ν¬λ¦½νΈ νμμΌλ‘ λΉνΈμ½μΈ νλ‘ν μ½μ λν μ§λΆ κ±°λ μ νμ΄λ€. μ£Όμλ 1λ‘ μμνλλ°, μΈκ·Έμμ μ§μνλ μλ‘μ΄ μ£Όμ 3 λλ bc1λ‘ μμνλ μ£Όμλ³΄λ€ ν¨μ¬ λΉμΈλ€. https://mirror.xyz/0xA1d9f681B25C14C1eE7B87f1CF102E73cA3ad4d9/egjhNVklgy_LgZmcTXXAOTBa6ePBqO3Ja9ZSoDIad-8 μ¦, λΉνΈμ½μΈ μ£Όμκ° 1λ‘ μμνλ©΄ P2PKH μ£Όμλ₯Ό μ¬μ©νκ³ μλ κ²μ΄λ€. 곡κ°ν€μ κ°λ¨ν ν΄μμ΄λ©°, μ΄ ν΄μλ₯Ό μ£Όμλ‘ μ¬μ©νλ κ²μ΄λ€. μ΄κ²μ μλ λΉνΈμ½μΈ μ£Όμ νμμ΄μμΌλ©° μ€λκΉμ§λ μΆ©μ€ν μλνλ€. λ κ±°μ μ£Όμλ μΈκ·Έμκ³Ό νΈνλμ§ μμ§λ§, μ¬μ ν λ¬Έμ μμ΄ P2PKH μ£Όμμμ μΈκ·Έμ μ£Όμλ‘ BTCλ₯Ό λ³΄λΌ μ μλ€. κ·Έλ¬λ λ κ±°μ μ£Όμ νΈλμμ μ΄ λ ν¬κΈ° λλ¬Έμ P2PKH μ£Όμμμ μ μ‘νλ νκ· μλλ μΈκ·Έμ μ£Όμμμ μ μ‘ν λλ³΄λ€ λ λμ μκΈμ΄ λ°μν μ μλ€....
Gas optimization in Solidity, Ethereum
Iβm sorry but my English is terrible. I hope you understand that generously.Recently, I was developing a toy project named Blind Market. Itβs a simple P2P trading application using smart contract. I was making a contract using Solidity, and the trade stage proceeded in the order of pending, shipping, and done. The problem was appeared in done phase. The problem was that when I tried to close the transaction by paying the price raised by the seller in msg.value, the following error occurred.Pe...
Uvicorn & Gunicorn
Uvicorn and GunicornUvicorn and Gunicorn are important concepts when developing applications in Python. However, there are many concepts to be aware of in order to fully understand Uvicorn and Gunicorn. The following is a brief summary of the necessary concepts, and the details will be dealt with separately later.Necessary ConceptsStarletteStarlette is a Web application server that can run asynchronously. Starlette runs on top of Uvicorn.FastAPIFastAPI provides many features on top of Starlet...
P2WPKH
P2WPKHP2WPKHλ λΉνΈμ½μΈ λ΄μμ κ°μ₯ μΌλ°μ μΈ μ€ν¬λ¦½νΈ νμμΌλ‘ λΉνΈμ½μΈ νλ‘ν μ½μ λν μ§λΆ κ±°λ μ νμ΄λ€. μ£Όμλ 1λ‘ μμνλλ°, μΈκ·Έμμ μ§μνλ μλ‘μ΄ μ£Όμ 3 λλ bc1λ‘ μμνλ μ£Όμλ³΄λ€ ν¨μ¬ λΉμΈλ€. https://mirror.xyz/0xA1d9f681B25C14C1eE7B87f1CF102E73cA3ad4d9/egjhNVklgy_LgZmcTXXAOTBa6ePBqO3Ja9ZSoDIad-8 μ¦, λΉνΈμ½μΈ μ£Όμκ° 1λ‘ μμνλ©΄ P2PKH μ£Όμλ₯Ό μ¬μ©νκ³ μλ κ²μ΄λ€. 곡κ°ν€μ κ°λ¨ν ν΄μμ΄λ©°, μ΄ ν΄μλ₯Ό μ£Όμλ‘ μ¬μ©νλ κ²μ΄λ€. μ΄κ²μ μλ λΉνΈμ½μΈ μ£Όμ νμμ΄μμΌλ©° μ€λκΉμ§λ μΆ©μ€ν μλνλ€. λ κ±°μ μ£Όμλ μΈκ·Έμκ³Ό νΈνλμ§ μμ§λ§, μ¬μ ν λ¬Έμ μμ΄ P2PKH μ£Όμμμ μΈκ·Έμ μ£Όμλ‘ BTCλ₯Ό λ³΄λΌ μ μλ€. κ·Έλ¬λ λ κ±°μ μ£Όμ νΈλμμ μ΄ λ ν¬κΈ° λλ¬Έμ P2PKH μ£Όμμμ μ μ‘νλ νκ· μλλ μΈκ·Έμ μ£Όμμμ μ μ‘ν λλ³΄λ€ λ λμ μκΈμ΄ λ°μν μ μλ€....
μλ°μ€ν¬λ¦½νΈμ ν¨μλ νΈμΆλ λ, λ§€κ°λ³μλ‘ μ λ¬λλ μΈμκ° μ΄μΈμ, arguments κ°μ²΄μ thisλ₯Ό μ λ¬λ°λλ€.
function example(someNumber) {
console.log(arguments);
console.log(this);
console.log(someNumber);
}
example(2)
----------------------------------------------------------
[Arguments] { '0': 2 }
<ref *1> Object [global] {
global: [Circular *1],
clearInterval: [Function: clearInterval],
clearTimeout: [Function: clearTimeout],
setInterval: [Function: setInterval],
setTimeout: [Function: setTimeout] {
[Symbol(nodejs.util.promisify.custom)]: [Getter]
},
queueMicrotask: [Function: queueMicrotask],
performance: Performance {
nodeTiming: PerformanceNodeTiming {
name: 'node',
entryType: 'node',
startTime: 0,
duration: 26.50162499397993,
nodeStart: 0.9319169968366623,
v8Start: 1.9625839963555336,
bootstrapComplete: 19.07591699808836,
environment: 10.603083997964859,
loopStart: -1,
loopExit: -1,
idleTime: 0
},
timeOrigin: 1669163218176.664
},
clearImmediate: [Function: clearImmediate],
setImmediate: [Function: setImmediate] {
[Symbol(nodejs.util.promisify.custom)]: [Getter]
}
}
2
μλ°μ€ν¬λ¦½νΈμ κ²½μ° Javaμ κ°μ΄ thisμ λ°μΈλ©λλ κ°μ²΄λ νκ°μ§κ° μλλΌ ν΄λΉ ν¨μ νΈμΆ λ°©μμ λ°λΌ thisμ λ°μΈλ©λλ κ°μ²΄κ° λ¬λΌμ§λ€.
ν¨μμ μμ μ€μ½νλ₯Ό κ²°μ νλ λ°©μμΈ Lexical ScopeλΌλ κ²μ΄ μλ€.
μ΄λ₯Ό μ€λͺ νκΈ° μν΄μ λ¨Όμ μ€μ½νλΆν° μ§κ³ λμ΄κ°μ.
μ€μ½νλ μλ°μ€ν¬λ¦½νΈλ₯Ό ν¬ν¨ν λͺ¨λ νλ‘κ·Έλλ° μΈμ΄μ κΈ°λ³Έμ μΈ κ°λ μ΄λ€.
var x = 'global scope'
function scope(someNumber) {
var x = 'function scope'
console.log(x);
}
scope()
console.log(x);
μ΄λ¦μ΄ κ°μ λ³μ xκ° μ μμμ 1λ², ν¨μ λ΄λΆμμ 1λ² μ μΈλμλ€.
μ°λ¦¬λ μ΄λ―Έ ν¨μ λ΄λΆμμλ function scope, μ μμμλ global scopeκ° μΆλ ₯λ리λΌλ κ²μ μκ³ μλ€.
μ€μ½νλ μ°Έμ‘° λμ μλ³μλ₯Ό μ°Ύμλ΄κΈ° μν κ·μΉμ΄λ€. μλ°μ€ν¬λ¦½νΈλ μ΄ κ·μΉλλ‘ μλ³μλ₯Ό μ°Ύλλ€.
μ μμ μμ μ μμ μ μΈλ λ³μ xλ μ΄λμλ μ°Έμ‘°ν μ μλ€.
νμ§λ§ ν¨μ foo λ΄μμ μ μΈλ λ³μ xλ ν¨μ foo λ΄λΆμμλ§ μ°Έμ‘°ν μ μκ³ ν¨μ μΈλΆμμλ μ°Έμ‘°ν μ μλ€. μ΄λ¬ν κ·μΉμ μ€μ½νλΌκ³ νλ€.
μλ°μ€ν¬λ¦½νΈμ μ€μ½νλ₯Ό ꡬλΆν΄λ³΄λ©΄ λ€μκ³Ό κ°μ΄ 2 κ°μ§λ‘ λλ μ μλ€.
μ½λ μ΄λμμλ μ§ μ°Έμ‘° κ°λ₯
ν¨μ μ½λ λΈλ‘μ΄ λ§λ μ€μ½ν, ν¨μ μμ κ³Ό νμ ν¨μμμ μ°Έμ‘° κ°λ₯
λ³μμ κ΄μ μμ μ€μ½νλ₯Ό ꡬλΆνλ©΄ λ€μκ³Ό κ°μ΄ λλ μ μλ€.
μ μμμ μ μΈλ λ³μ, μ΄λμλ μ°Έμ‘° κ°λ₯
μ§μ(ν¨μ)λ΄μμ μ μΈλ λ³μμ΄λ©° κ·Έ μ§μκ³Ό κ·Έ μ§μμ νλΆ μ§μμμλ§ μ°Έμ‘°ν μ μλ€.
λ³μλ μ μΈ μμΉμ μν΄ μ€μ½νλ₯Ό κ°μ§κ² λλ€.
μ¦, μ μμμ μ μΈλ λ³μλ μ μ μ€μ½νλ₯Ό κ°λ μ μ λ³μκ° λκ³ , μ§μμμ μ μΈλ λ³μλ μ§μ μ€μ½νλ₯Ό κ°λ μ§μ λ³μκ° λλ€.
μλ°μ€ν¬λ¦½νΈμ μ€μ½νλ ν μΈμ΄μλ λ€λ₯Έ νΉμ§μ΄ μλ€.
C-Family languageλ λΈλ‘λ 벨 μ€μ½νλ₯Ό λ°λ₯΄μ§λ§, μλ°μ€ν¬λ¦½νΈλ ν¨μλ 벨 μ€μ½νλ₯Ό λ°λ₯Έλ€.
λΈλ‘λ 벨 μ€μ½νΒ : μ½λ λΈλ‘ λ΄μμλ§ μ ν¨νλ€.
ν¨μλ 벨 μ€μ½νΒ : ν¨μ μ½λ λΈλ‘ λ΄μμλ§ μ ν¨νκ³ ν¨μ μΈλΆμμλ μ ν¨νμ§ μμ
var x = 0;
{
var x = 1;
console.log(x); // 1
}
console.log(x); // 1
let y = 0;
{
let y = 1;
console.log(y); // 1
}
console.log(y); // 0
μμ μμμμ xλ ν¨μλ 벨 μ€μ½νλ₯Ό λ°λ₯΄κΈ° λλ¬Έμ xλ 1μ΄ κ·Έλλ‘ μΆλ ₯λκ³ , yλ λΈλ‘λ 벨 μ€μ½νλ₯Ό λ°λ₯΄κΈ° λλ¬Έμ 0μ΄ μΆλ ₯λλ€.
μμΈν μ¬νμ let-var-const μ λν΄μ μμ보면 μ’λ€.
// μ μ μ€μ½νμ μ§μ μ€μ½ν ..
var global = 'global';
function foo() {
var local = 'local';
console.log(global);
console.log(local);
}
foo();
console.log(global);
console.log(local); // Uncaught ReferenceError: local is not defined
for (var i = 0; i < 5; i++) {
console.log(i); // 0..1..2..3..4..
}
console.log(i); // 5
μμ μ½λλ λλκ²λ μλ¬ μμ΄ μ€νμ΄ λλ€.
μλ°μ€ν¬λ¦½νΈλ λΈλ‘ λ 벨 μ€μ½νλ₯Ό μ¬μ©νμ§ μμΌλ―λ‘ ν¨μ λ°μμ μ μΈλ λ³μλ μ½λ λΈλ‘ λ΄μμ μ μΈλμλ€ ν μ§λΌλ λͺ¨λ μ μ μ€μ½νλ₯Ό κ°μ§λ€.
λ°λΌμ λ³μ iλ μ μ λ³μμ΄λ€.
var a = 10; // μ μλ³μ
(function () {
var b = 20; // μ§μλ³μ
})();
console.log(a); // 10
console.log(b); // "b" is not defined
μλ°μ€ν¬λ¦½νΈλ ν¨μ λ 벨 μ€μ½νλ₯Ό μ¬μ©νλ€.
μ¦, ν¨μ λ΄μμ μ μΈλ λ§€κ°λ³μμ λ³μλ ν¨μ μΈλΆμμλ μ ν¨νμ§ μλ€. λ°λΌμ λ³μ bλ μ§μ λ³μμ΄λ€.
var x = 'global';
function foo() {
var x = 'local';
console.log(x);
function bar() { // λ΄λΆν¨μ
console.log(x); // ?
}
bar();
}
foo();
console.log(x); // ?
μ μ μμμμλ μ μλ³μλ§, μ§μ μμμμλ μ§μλ³μμ μ μλ³μ λͺ¨λ μ°Έμ‘°κ° κ°λ₯νλ€.
κ·Έλ¬λ λ³μλͺ μ΄ μ€λ³΅λλ κ²½μ°, μ§μ λ³μλ₯Ό μ°μ νμ¬ μ°Έκ³ νλ€.
λ΄λΆ ν¨μλ μμ μ ν¬ν¨νκ³ μλ μΈλΆ ν¨μμ λ³μμ μ κ·Όν μ μλ€.
μμ ν¨μ barμμ μ°Έμ‘°νλ λ³μ xλ ν¨μ fooμμ μ μΈλ μ§μλ³μμ΄λ€.
μ΄λ μ€ν 컨ν μ€νΈμ μ€μ½ν 체μΈμ μν΄ μ°Έμ‘° μμμμ μ μλ³μ xκ° λ€λ‘ λ°λ ΈκΈ° λλ¬Έμ΄λ€.
var x = 1;
function foo() {
var x = 10;
bar();
}
function bar() {
console.log(x);
}
foo(); // ?
bar(); // ?
μμ μ€μ½νμ κ²°μ μ Lexical Scopeμ μν΄ μ΄λ£¨μ΄μ§λ€κ³ νλ©΄μ μ€μ½νμ λν μ€λͺ μ νλ€.
μλ°μ€ν¬λ¦½νΈλ₯Ό λΉλ‘―ν λλΆλΆμ νλ‘κ·Έλλ° μΈμ΄λ λ μ컬 μ€μ½νλ₯Ό λ°λ₯΄λλ°, ν¨μλ₯Ό μ΄λμ μ μΈνμλμ§μ λ°λΌ μμ μ€μ½νλ₯Ό κ²°μ νλ€.
λ μ컬 μ€μ½νλ ν¨μλ₯Ό μ΄λμ νΈμΆνλμ§κ° μλλΌ μ΄λμ μ μΈνμλμ§μ λ°λΌ κ²°μ λλ€.
λ°λΌμ ν¨μ barμ μμ μ€μ½νλ μ μ μ€μ½νμ΄κ³ μ μμ λ μ μ λ³μ xμ κ° 1μ λλ² μΆλ ₯νλ€.
μ, μ΄μ λ€μ λμμμ thisμ λν μ΄μΌκΈ°λ₯Ό ν΄λ³΄μ.
ν¨μμ μμ μ€μ½νλ₯Ό κ²°μ νλ λ°©μμΈ λ μ컬 μ€μ½νλ ν¨μλ₯Ό μ μΈν λ κ²°μ λκ³ , μ΄λ this λ°μΈλ©κ³Ό λ€λ₯΄λ€.
thisλ ν¨μκ° νΈμΆλ λ μ΄λ»κ² νΈμΆλμλμ§μ λ°λΌ λμ μΌλ‘ κ²°μ λλ€.
ν¨μλ₯Ό νΈμΆνλ λ°©μμ λ€μνλ€. ν λ² νλμ© μ°¨κ·Όμ°¨κ·Ό λ€λ£¨μ΄λ³΄μ.
μΌλ¨ ν¬κ² μλ λ°©μμΌλ‘ μΌμ΄μ€λ₯Ό λλμ΄λ³΄μ.
var dirThis = function () {
console.dir(this);
}
// 1. ν¨μ νΈμΆ
dirThis(); // global || window
// 2. λ©μλ νΈμΆ
var foo = { fn: dirThis }
foo.fn(); // obj
// 3. μμ±μ ν¨μ νΈμΆ
var instance = new dirThis(); // instance
// 4. apply/call/bind νΈμΆ
var bar = { fn: dirThis };
μ μ κ°μ²΄λ λͺ¨λ κ°μ²΄μ μ μΌν μ΅μμ κ°μ²΄λ‘, μΌλ°μ μΌλ‘ Browser-sideμμλ windowΒ , Server-side(Node.js)μμλ global κ°μ²΄λ₯Ό μλ―Ένλ€.
μ μκ°μ²΄λ μ μ μ€μ½ν(Global Scope)λ₯Ό κ°λ μ μλ³μ(Global variable)λ₯Ό νλ‘νΌν°λ‘ μμ νλ€.
κΈλ‘λ² μμμ μ μΈν ν¨μλ μ μκ°μ²΄μ νλ‘νΌν°λ‘ μ κ·Όν μ μλ μ μ λ³μμ λ©μλμ΄λ€.
κΈ°λ³Έμ μΌλ‘ thisλ μ μκ°μ²΄(Global object)μ λ°μΈλ©λλ€. μ μν¨μλ λ¬Όλ‘ μ΄κ³ μ¬μ§μ΄ λ΄λΆν¨μμ κ²½μ°λ thisλ μΈλΆν¨μκ° μλ μ μκ°μ²΄μ λ°μΈλ©λλ€.
var ga = 'Global variable';
console.log(ga);
console.log(window.ga);
function foo() {
console.log('invoked!');
}
window.foo();
---------------------------------------------------------
function foo() {
console.log("foo's this: ", this); // window
function bar() {
console.log("bar's this: ", this); // window
}
bar();
}
foo();

λ΄λΆν¨μλ μΌλ° ν¨μ, λ©μλ, μ½λ°±ν¨μ μ΄λμμ μ μΈλμλ κ΄κ²μμ΄ thisλ μ μκ°μ²΄λ₯Ό λ°μΈλ©νλ€.
λκΈλΌμ€ ν¬λ½ν¬λλ βμ΄κ²μ μ€κ³ λ¨κ³μ κ²°ν¨μΌλ‘ λ©μλκ° λ΄λΆν¨μλ₯Ό μ¬μ©νμ¬ μμ μ μμ μ λκ² ν μ μλ€λ κ²μ μλ―Ένλ€β λΌκ³ λ§νλ€.
λ΄λΆν¨μμ thisκ° μ μκ°μ²΄λ₯Ό μ°Έμ‘°νλ κ²μ ννΌλ°©λ²μ μλμ κ°λ€.
var value = 1;
var obj = {
value: 100,
foo: function() {
var that = this; // Workaround : this === obj
console.log("foo's this: ", this); // obj
console.log("foo's this.value: ", this.value); // 100
function bar() {
console.log("bar's this: ", this); // window
console.log("bar's this.value: ", this.value); // 1
console.log("bar's that: ", that); // obj
console.log("bar's that.value: ", that.value); // 100
}
bar();
}
};
obj.foo();

μ λ°©λ² μ΄μΈμλ μλ°μ€ν¬λ¦½νΈλ thisλ₯Ό λͺ μμ μΌλ‘ λ°μΈλ©ν μ μλ apply, call, bind λ©μλλ₯Ό μ 곡νλ€.
var value = 1;
var obj = {
value: 100,
foo: function() {
console.log("foo's this: ", this); // obj
console.log("foo's this.value: ", this.value); // 100
function bar(a, b) {
console.log("bar's this: ", this); // obj
console.log("bar's this.value: ", this.value); // 100
console.log("bar's arguments: ", arguments);
}
bar.apply(obj, [1, 2]);
bar.call(obj, 1, 2);
bar.bind(obj)(1, 2);
}
};
obj.foo();
ν¨μκ° κ°μ²΄μ νλ‘νΌν° κ°μ΄λ©΄ λ©μλλ‘μ νΈμΆλλ€. μ΄λ λ©μλ λ΄λΆμ thisλ ν΄λΉ λ©μλλ₯Ό μμ ν κ°μ²΄, μ¦ ν΄λΉ λ©μλλ₯Ό νΈμΆν κ°μ²΄μ λ°μΈλ©λλ€.
var obj1 = {
name: 'Lee',
sayName: function() {
console.log(this.name);
}
}
var obj2 = {
name: 'Kim'
}
obj2.sayName = obj1.sayName;
obj1.sayName();
obj2.sayName();

μλ°μ€ν¬λ¦½νΈμ μμ±μ ν¨μλ λ§ κ·Έλλ‘ κ°μ²΄λ₯Ό μμ±νλ μν μ νλ€.
νμ§λ§ μλ°μ κ°μ κ°μ²΄μ§ν₯ μΈμ΄μ μμ±μ ν¨μμλ λ€λ₯΄κ² κ·Έ νμμ΄ μ ν΄μ Έ μλ κ²μ΄ μλλΌ κΈ°μ‘΄ ν¨μμ new μ°μ°μλ₯Ό λΆμ¬μ νΈμΆνλ©΄ ν΄λΉ ν¨μλ μμ±μ ν¨μλ‘ λμνλ€.
μ΄λ λ°λλ‘ μκ°νλ©΄ μμ±μ ν¨μκ° μλ μΌλ° ν¨μμ new μ°μ°μλ₯Ό λΆμ¬ νΈμΆνλ©΄ μμ±μ ν¨μμ²λΌ λμν μ μλ€.
λ°λΌμ μΌλ°μ μΌλ‘ μμ±μ ν¨μλͺ μ 첫문μλ₯Ό λλ¬Έμλ‘ κΈ°μ νμ¬ νΌλμ λ°©μ§νλ €λ λ Έλ ₯μ νλ€.
// μμ±μ ν¨μ
function Person(name) {
this.name = name;
}
var me = new Person('Lee');
console.log(me); // Person {name: "Lee"}
// new μ°μ°μμ ν¨κ» μμ±μ ν¨μλ₯Ό νΈμΆνμ§ μμΌλ©΄ μμ±μ ν¨μλ‘ λμνμ§ μλλ€.
var you = Person('Kim');
console.log(you); // undefined
new μ°μ°μμ ν¨κ» μμ±μ ν¨μλ₯Ό νΈμΆνλ©΄ this λ°μΈλ©μ΄ λ©μλλ ν¨μ νΈμΆ λμλ λ€λ₯΄κ² λμνλ€.
λΉ κ°μ²΄ μμ± λ° this λ°μΈλ©
μμ±μ ν¨μμ μ½λκ° μ€νλκΈ° μ λΉ κ°μ²΄κ° μμ±λλ€.
μ΄ λΉ κ°μ²΄κ° μμ±μ ν¨μκ° μλ‘ μμ±νλ κ°μ²΄μ΄λ€. μ΄ν μμ±μ ν¨μ λ΄μμ μ¬μ©λλ thisλ μ΄ λΉ κ°μ²΄λ₯Ό κ°λ¦¬ν¨λ€.
κ·Έλ¦¬κ³ μμ±λ λΉ κ°μ²΄λ μμ±μ ν¨μμ prototype νλ‘νΌν°κ° κ°λ¦¬ν€λ κ°μ²΄λ₯Ό μμ μ νλ‘ν νμ κ°μ²΄λ‘ μ€μ νλ€.
thisλ₯Ό ν΅ν νλ‘νΌν° μμ±
μμ±λ λΉ κ°μ²΄μ thisλ₯Ό μ¬μ©νμ¬ λμ μΌλ‘ νλ‘νΌν°λ λ©μλλ₯Ό μμ±ν μ μλ€.
thisλ μλ‘ μμ±λ κ°μ²΄λ₯Ό κ°λ¦¬ν€λ―λ‘ thisλ₯Ό ν΅ν΄ μμ±ν νλ‘νΌν°μ λ©μλλ μλ‘ μμ±λ κ°μ²΄μ μΆκ°λλ€.
μμ±λ κ°μ²΄ λ°ν
λ°νλ¬Έμ΄ μλ κ²½μ°, thisμ λ°μΈλ©λ μλ‘ μμ±ν κ°μ²΄κ° λ°νλλ€. λͺ μμ μΌλ‘ thisλ₯Ό λ°ννμ¬λ κ²°κ³Όλ κ°λ€.
λ°νλ¬Έμ΄ thisκ° μλ λ€λ₯Έ κ°μ²΄λ₯Ό λͺ μμ μΌλ‘ λ°ννλ κ²½μ°, thisκ° μλ ν΄λΉ κ°μ²΄κ° λ°νλλ€.
μ΄ λ thisλ₯Ό λ°ννμ§ μμ ν¨μλ μμ±μ ν¨μλ‘μμ μν μ μννμ§ λͺ»νλ€. λ°λΌμ μμ±μ ν¨μλ λ°νλ¬Έμ λͺ μμ μΌλ‘ μ¬μ©νμ§ μλλ€.

thisμ λ°μΈλ©λ κ°μ²΄λ ν¨μ νΈμΆ ν¨ν΄μ μν΄ κ²°μ λλ€.
μ΄λ μλ°μ€ν¬λ¦½νΈ μμ§μ΄ μννλ κ²μ΄λ€.
μ΄λ¬ν μλ°μ€ν¬λ¦½νΈ μμ§μ μ묡μ this λ°μΈλ© μ΄μΈμ thisλ₯Ό νΉμ κ°μ²΄μ λͺ μμ μΌλ‘ λ°μΈλ©νλ λ°©λ²λ μ 곡λλ€.
μ΄κ²μ κ°λ₯νκ² νλ κ²μ΄
Function.prototype.apply
Function.prototype.call
λ©μλμ΄λ€.
μ΄ λ©μλλ€μ λͺ¨λ ν¨μ κ°μ²΄μ νλ‘ν νμ κ°μ²΄μΈ Function.prototype κ°μ²΄μ λ©μλμ΄λ€.
κΈ°μ΅ν΄μΌ ν κ²μ apply() λ©μλλ₯Ό νΈμΆνλ 주체λ ν¨μμ΄λ©° apply() λ©μλλ thisλ₯Ό νΉμ κ°μ²΄μ λ°μΈλ©ν λΏ λ³Έμ§μ μΈ κΈ°λ₯μ ν¨μ νΈμΆμ΄λΌλ κ²μ΄λ€.
func.apply(thisArg, [argsArray])
Person.apply(someFunc, [1, 2, 3])
Person.call(someFunc, 1, 2, 3)
// thisArg: ν¨μ λ΄λΆμ thisμ λ°μΈλ©ν κ°μ²΄
// argsArray: ν¨μμ μ λ¬ν argumentμ λ°°μ΄
function convertArgsToArray() {
console.log(arguments);
// arguments κ°μ²΄λ₯Ό λ°°μ΄λ‘ λ³ν
// slice: λ°°μ΄μ νΉμ λΆλΆμ λν 볡μ¬λ³Έμ μμ±νλ€.
var arr = Array.prototype.slice.apply(arguments); // arguments.slice
// var arr = [].slice.apply(arguments);
console.log(arr);
return arr;
}
convertArgsToArray(1, 2, 3);

μλ°μ€ν¬λ¦½νΈμ ν¨μλ νΈμΆλ λ, λ§€κ°λ³μλ‘ μ λ¬λλ μΈμκ° μ΄μΈμ, arguments κ°μ²΄μ thisλ₯Ό μ λ¬λ°λλ€.
function example(someNumber) {
console.log(arguments);
console.log(this);
console.log(someNumber);
}
example(2)
----------------------------------------------------------
[Arguments] { '0': 2 }
<ref *1> Object [global] {
global: [Circular *1],
clearInterval: [Function: clearInterval],
clearTimeout: [Function: clearTimeout],
setInterval: [Function: setInterval],
setTimeout: [Function: setTimeout] {
[Symbol(nodejs.util.promisify.custom)]: [Getter]
},
queueMicrotask: [Function: queueMicrotask],
performance: Performance {
nodeTiming: PerformanceNodeTiming {
name: 'node',
entryType: 'node',
startTime: 0,
duration: 26.50162499397993,
nodeStart: 0.9319169968366623,
v8Start: 1.9625839963555336,
bootstrapComplete: 19.07591699808836,
environment: 10.603083997964859,
loopStart: -1,
loopExit: -1,
idleTime: 0
},
timeOrigin: 1669163218176.664
},
clearImmediate: [Function: clearImmediate],
setImmediate: [Function: setImmediate] {
[Symbol(nodejs.util.promisify.custom)]: [Getter]
}
}
2
μλ°μ€ν¬λ¦½νΈμ κ²½μ° Javaμ κ°μ΄ thisμ λ°μΈλ©λλ κ°μ²΄λ νκ°μ§κ° μλλΌ ν΄λΉ ν¨μ νΈμΆ λ°©μμ λ°λΌ thisμ λ°μΈλ©λλ κ°μ²΄κ° λ¬λΌμ§λ€.
ν¨μμ μμ μ€μ½νλ₯Ό κ²°μ νλ λ°©μμΈ Lexical ScopeλΌλ κ²μ΄ μλ€.
μ΄λ₯Ό μ€λͺ νκΈ° μν΄μ λ¨Όμ μ€μ½νλΆν° μ§κ³ λμ΄κ°μ.
μ€μ½νλ μλ°μ€ν¬λ¦½νΈλ₯Ό ν¬ν¨ν λͺ¨λ νλ‘κ·Έλλ° μΈμ΄μ κΈ°λ³Έμ μΈ κ°λ μ΄λ€.
var x = 'global scope'
function scope(someNumber) {
var x = 'function scope'
console.log(x);
}
scope()
console.log(x);
μ΄λ¦μ΄ κ°μ λ³μ xκ° μ μμμ 1λ², ν¨μ λ΄λΆμμ 1λ² μ μΈλμλ€.
μ°λ¦¬λ μ΄λ―Έ ν¨μ λ΄λΆμμλ function scope, μ μμμλ global scopeκ° μΆλ ₯λ리λΌλ κ²μ μκ³ μλ€.
μ€μ½νλ μ°Έμ‘° λμ μλ³μλ₯Ό μ°Ύμλ΄κΈ° μν κ·μΉμ΄λ€. μλ°μ€ν¬λ¦½νΈλ μ΄ κ·μΉλλ‘ μλ³μλ₯Ό μ°Ύλλ€.
μ μμ μμ μ μμ μ μΈλ λ³μ xλ μ΄λμλ μ°Έμ‘°ν μ μλ€.
νμ§λ§ ν¨μ foo λ΄μμ μ μΈλ λ³μ xλ ν¨μ foo λ΄λΆμμλ§ μ°Έμ‘°ν μ μκ³ ν¨μ μΈλΆμμλ μ°Έμ‘°ν μ μλ€. μ΄λ¬ν κ·μΉμ μ€μ½νλΌκ³ νλ€.
μλ°μ€ν¬λ¦½νΈμ μ€μ½νλ₯Ό ꡬλΆν΄λ³΄λ©΄ λ€μκ³Ό κ°μ΄ 2 κ°μ§λ‘ λλ μ μλ€.
μ½λ μ΄λμμλ μ§ μ°Έμ‘° κ°λ₯
ν¨μ μ½λ λΈλ‘μ΄ λ§λ μ€μ½ν, ν¨μ μμ κ³Ό νμ ν¨μμμ μ°Έμ‘° κ°λ₯
λ³μμ κ΄μ μμ μ€μ½νλ₯Ό ꡬλΆνλ©΄ λ€μκ³Ό κ°μ΄ λλ μ μλ€.
μ μμμ μ μΈλ λ³μ, μ΄λμλ μ°Έμ‘° κ°λ₯
μ§μ(ν¨μ)λ΄μμ μ μΈλ λ³μμ΄λ©° κ·Έ μ§μκ³Ό κ·Έ μ§μμ νλΆ μ§μμμλ§ μ°Έμ‘°ν μ μλ€.
λ³μλ μ μΈ μμΉμ μν΄ μ€μ½νλ₯Ό κ°μ§κ² λλ€.
μ¦, μ μμμ μ μΈλ λ³μλ μ μ μ€μ½νλ₯Ό κ°λ μ μ λ³μκ° λκ³ , μ§μμμ μ μΈλ λ³μλ μ§μ μ€μ½νλ₯Ό κ°λ μ§μ λ³μκ° λλ€.
μλ°μ€ν¬λ¦½νΈμ μ€μ½νλ ν μΈμ΄μλ λ€λ₯Έ νΉμ§μ΄ μλ€.
C-Family languageλ λΈλ‘λ 벨 μ€μ½νλ₯Ό λ°λ₯΄μ§λ§, μλ°μ€ν¬λ¦½νΈλ ν¨μλ 벨 μ€μ½νλ₯Ό λ°λ₯Έλ€.
λΈλ‘λ 벨 μ€μ½νΒ : μ½λ λΈλ‘ λ΄μμλ§ μ ν¨νλ€.
ν¨μλ 벨 μ€μ½νΒ : ν¨μ μ½λ λΈλ‘ λ΄μμλ§ μ ν¨νκ³ ν¨μ μΈλΆμμλ μ ν¨νμ§ μμ
var x = 0;
{
var x = 1;
console.log(x); // 1
}
console.log(x); // 1
let y = 0;
{
let y = 1;
console.log(y); // 1
}
console.log(y); // 0
μμ μμμμ xλ ν¨μλ 벨 μ€μ½νλ₯Ό λ°λ₯΄κΈ° λλ¬Έμ xλ 1μ΄ κ·Έλλ‘ μΆλ ₯λκ³ , yλ λΈλ‘λ 벨 μ€μ½νλ₯Ό λ°λ₯΄κΈ° λλ¬Έμ 0μ΄ μΆλ ₯λλ€.
μμΈν μ¬νμ let-var-const μ λν΄μ μμ보면 μ’λ€.
// μ μ μ€μ½νμ μ§μ μ€μ½ν ..
var global = 'global';
function foo() {
var local = 'local';
console.log(global);
console.log(local);
}
foo();
console.log(global);
console.log(local); // Uncaught ReferenceError: local is not defined
for (var i = 0; i < 5; i++) {
console.log(i); // 0..1..2..3..4..
}
console.log(i); // 5
μμ μ½λλ λλκ²λ μλ¬ μμ΄ μ€νμ΄ λλ€.
μλ°μ€ν¬λ¦½νΈλ λΈλ‘ λ 벨 μ€μ½νλ₯Ό μ¬μ©νμ§ μμΌλ―λ‘ ν¨μ λ°μμ μ μΈλ λ³μλ μ½λ λΈλ‘ λ΄μμ μ μΈλμλ€ ν μ§λΌλ λͺ¨λ μ μ μ€μ½νλ₯Ό κ°μ§λ€.
λ°λΌμ λ³μ iλ μ μ λ³μμ΄λ€.
var a = 10; // μ μλ³μ
(function () {
var b = 20; // μ§μλ³μ
})();
console.log(a); // 10
console.log(b); // "b" is not defined
μλ°μ€ν¬λ¦½νΈλ ν¨μ λ 벨 μ€μ½νλ₯Ό μ¬μ©νλ€.
μ¦, ν¨μ λ΄μμ μ μΈλ λ§€κ°λ³μμ λ³μλ ν¨μ μΈλΆμμλ μ ν¨νμ§ μλ€. λ°λΌμ λ³μ bλ μ§μ λ³μμ΄λ€.
var x = 'global';
function foo() {
var x = 'local';
console.log(x);
function bar() { // λ΄λΆν¨μ
console.log(x); // ?
}
bar();
}
foo();
console.log(x); // ?
μ μ μμμμλ μ μλ³μλ§, μ§μ μμμμλ μ§μλ³μμ μ μλ³μ λͺ¨λ μ°Έμ‘°κ° κ°λ₯νλ€.
κ·Έλ¬λ λ³μλͺ μ΄ μ€λ³΅λλ κ²½μ°, μ§μ λ³μλ₯Ό μ°μ νμ¬ μ°Έκ³ νλ€.
λ΄λΆ ν¨μλ μμ μ ν¬ν¨νκ³ μλ μΈλΆ ν¨μμ λ³μμ μ κ·Όν μ μλ€.
μμ ν¨μ barμμ μ°Έμ‘°νλ λ³μ xλ ν¨μ fooμμ μ μΈλ μ§μλ³μμ΄λ€.
μ΄λ μ€ν 컨ν μ€νΈμ μ€μ½ν 체μΈμ μν΄ μ°Έμ‘° μμμμ μ μλ³μ xκ° λ€λ‘ λ°λ ΈκΈ° λλ¬Έμ΄λ€.
var x = 1;
function foo() {
var x = 10;
bar();
}
function bar() {
console.log(x);
}
foo(); // ?
bar(); // ?
μμ μ€μ½νμ κ²°μ μ Lexical Scopeμ μν΄ μ΄λ£¨μ΄μ§λ€κ³ νλ©΄μ μ€μ½νμ λν μ€λͺ μ νλ€.
μλ°μ€ν¬λ¦½νΈλ₯Ό λΉλ‘―ν λλΆλΆμ νλ‘κ·Έλλ° μΈμ΄λ λ μ컬 μ€μ½νλ₯Ό λ°λ₯΄λλ°, ν¨μλ₯Ό μ΄λμ μ μΈνμλμ§μ λ°λΌ μμ μ€μ½νλ₯Ό κ²°μ νλ€.
λ μ컬 μ€μ½νλ ν¨μλ₯Ό μ΄λμ νΈμΆνλμ§κ° μλλΌ μ΄λμ μ μΈνμλμ§μ λ°λΌ κ²°μ λλ€.
λ°λΌμ ν¨μ barμ μμ μ€μ½νλ μ μ μ€μ½νμ΄κ³ μ μμ λ μ μ λ³μ xμ κ° 1μ λλ² μΆλ ₯νλ€.
μ, μ΄μ λ€μ λμμμ thisμ λν μ΄μΌκΈ°λ₯Ό ν΄λ³΄μ.
ν¨μμ μμ μ€μ½νλ₯Ό κ²°μ νλ λ°©μμΈ λ μ컬 μ€μ½νλ ν¨μλ₯Ό μ μΈν λ κ²°μ λκ³ , μ΄λ this λ°μΈλ©κ³Ό λ€λ₯΄λ€.
thisλ ν¨μκ° νΈμΆλ λ μ΄λ»κ² νΈμΆλμλμ§μ λ°λΌ λμ μΌλ‘ κ²°μ λλ€.
ν¨μλ₯Ό νΈμΆνλ λ°©μμ λ€μνλ€. ν λ² νλμ© μ°¨κ·Όμ°¨κ·Ό λ€λ£¨μ΄λ³΄μ.
μΌλ¨ ν¬κ² μλ λ°©μμΌλ‘ μΌμ΄μ€λ₯Ό λλμ΄λ³΄μ.
var dirThis = function () {
console.dir(this);
}
// 1. ν¨μ νΈμΆ
dirThis(); // global || window
// 2. λ©μλ νΈμΆ
var foo = { fn: dirThis }
foo.fn(); // obj
// 3. μμ±μ ν¨μ νΈμΆ
var instance = new dirThis(); // instance
// 4. apply/call/bind νΈμΆ
var bar = { fn: dirThis };
μ μ κ°μ²΄λ λͺ¨λ κ°μ²΄μ μ μΌν μ΅μμ κ°μ²΄λ‘, μΌλ°μ μΌλ‘ Browser-sideμμλ windowΒ , Server-side(Node.js)μμλ global κ°μ²΄λ₯Ό μλ―Ένλ€.
μ μκ°μ²΄λ μ μ μ€μ½ν(Global Scope)λ₯Ό κ°λ μ μλ³μ(Global variable)λ₯Ό νλ‘νΌν°λ‘ μμ νλ€.
κΈλ‘λ² μμμ μ μΈν ν¨μλ μ μκ°μ²΄μ νλ‘νΌν°λ‘ μ κ·Όν μ μλ μ μ λ³μμ λ©μλμ΄λ€.
κΈ°λ³Έμ μΌλ‘ thisλ μ μκ°μ²΄(Global object)μ λ°μΈλ©λλ€. μ μν¨μλ λ¬Όλ‘ μ΄κ³ μ¬μ§μ΄ λ΄λΆν¨μμ κ²½μ°λ thisλ μΈλΆν¨μκ° μλ μ μκ°μ²΄μ λ°μΈλ©λλ€.
var ga = 'Global variable';
console.log(ga);
console.log(window.ga);
function foo() {
console.log('invoked!');
}
window.foo();
---------------------------------------------------------
function foo() {
console.log("foo's this: ", this); // window
function bar() {
console.log("bar's this: ", this); // window
}
bar();
}
foo();

λ΄λΆν¨μλ μΌλ° ν¨μ, λ©μλ, μ½λ°±ν¨μ μ΄λμμ μ μΈλμλ κ΄κ²μμ΄ thisλ μ μκ°μ²΄λ₯Ό λ°μΈλ©νλ€.
λκΈλΌμ€ ν¬λ½ν¬λλ βμ΄κ²μ μ€κ³ λ¨κ³μ κ²°ν¨μΌλ‘ λ©μλκ° λ΄λΆν¨μλ₯Ό μ¬μ©νμ¬ μμ μ μμ μ λκ² ν μ μλ€λ κ²μ μλ―Ένλ€β λΌκ³ λ§νλ€.
λ΄λΆν¨μμ thisκ° μ μκ°μ²΄λ₯Ό μ°Έμ‘°νλ κ²μ ννΌλ°©λ²μ μλμ κ°λ€.
var value = 1;
var obj = {
value: 100,
foo: function() {
var that = this; // Workaround : this === obj
console.log("foo's this: ", this); // obj
console.log("foo's this.value: ", this.value); // 100
function bar() {
console.log("bar's this: ", this); // window
console.log("bar's this.value: ", this.value); // 1
console.log("bar's that: ", that); // obj
console.log("bar's that.value: ", that.value); // 100
}
bar();
}
};
obj.foo();

μ λ°©λ² μ΄μΈμλ μλ°μ€ν¬λ¦½νΈλ thisλ₯Ό λͺ μμ μΌλ‘ λ°μΈλ©ν μ μλ apply, call, bind λ©μλλ₯Ό μ 곡νλ€.
var value = 1;
var obj = {
value: 100,
foo: function() {
console.log("foo's this: ", this); // obj
console.log("foo's this.value: ", this.value); // 100
function bar(a, b) {
console.log("bar's this: ", this); // obj
console.log("bar's this.value: ", this.value); // 100
console.log("bar's arguments: ", arguments);
}
bar.apply(obj, [1, 2]);
bar.call(obj, 1, 2);
bar.bind(obj)(1, 2);
}
};
obj.foo();
ν¨μκ° κ°μ²΄μ νλ‘νΌν° κ°μ΄λ©΄ λ©μλλ‘μ νΈμΆλλ€. μ΄λ λ©μλ λ΄λΆμ thisλ ν΄λΉ λ©μλλ₯Ό μμ ν κ°μ²΄, μ¦ ν΄λΉ λ©μλλ₯Ό νΈμΆν κ°μ²΄μ λ°μΈλ©λλ€.
var obj1 = {
name: 'Lee',
sayName: function() {
console.log(this.name);
}
}
var obj2 = {
name: 'Kim'
}
obj2.sayName = obj1.sayName;
obj1.sayName();
obj2.sayName();

μλ°μ€ν¬λ¦½νΈμ μμ±μ ν¨μλ λ§ κ·Έλλ‘ κ°μ²΄λ₯Ό μμ±νλ μν μ νλ€.
νμ§λ§ μλ°μ κ°μ κ°μ²΄μ§ν₯ μΈμ΄μ μμ±μ ν¨μμλ λ€λ₯΄κ² κ·Έ νμμ΄ μ ν΄μ Έ μλ κ²μ΄ μλλΌ κΈ°μ‘΄ ν¨μμ new μ°μ°μλ₯Ό λΆμ¬μ νΈμΆνλ©΄ ν΄λΉ ν¨μλ μμ±μ ν¨μλ‘ λμνλ€.
μ΄λ λ°λλ‘ μκ°νλ©΄ μμ±μ ν¨μκ° μλ μΌλ° ν¨μμ new μ°μ°μλ₯Ό λΆμ¬ νΈμΆνλ©΄ μμ±μ ν¨μμ²λΌ λμν μ μλ€.
λ°λΌμ μΌλ°μ μΌλ‘ μμ±μ ν¨μλͺ μ 첫문μλ₯Ό λλ¬Έμλ‘ κΈ°μ νμ¬ νΌλμ λ°©μ§νλ €λ λ Έλ ₯μ νλ€.
// μμ±μ ν¨μ
function Person(name) {
this.name = name;
}
var me = new Person('Lee');
console.log(me); // Person {name: "Lee"}
// new μ°μ°μμ ν¨κ» μμ±μ ν¨μλ₯Ό νΈμΆνμ§ μμΌλ©΄ μμ±μ ν¨μλ‘ λμνμ§ μλλ€.
var you = Person('Kim');
console.log(you); // undefined
new μ°μ°μμ ν¨κ» μμ±μ ν¨μλ₯Ό νΈμΆνλ©΄ this λ°μΈλ©μ΄ λ©μλλ ν¨μ νΈμΆ λμλ λ€λ₯΄κ² λμνλ€.
λΉ κ°μ²΄ μμ± λ° this λ°μΈλ©
μμ±μ ν¨μμ μ½λκ° μ€νλκΈ° μ λΉ κ°μ²΄κ° μμ±λλ€.
μ΄ λΉ κ°μ²΄κ° μμ±μ ν¨μκ° μλ‘ μμ±νλ κ°μ²΄μ΄λ€. μ΄ν μμ±μ ν¨μ λ΄μμ μ¬μ©λλ thisλ μ΄ λΉ κ°μ²΄λ₯Ό κ°λ¦¬ν¨λ€.
κ·Έλ¦¬κ³ μμ±λ λΉ κ°μ²΄λ μμ±μ ν¨μμ prototype νλ‘νΌν°κ° κ°λ¦¬ν€λ κ°μ²΄λ₯Ό μμ μ νλ‘ν νμ κ°μ²΄λ‘ μ€μ νλ€.
thisλ₯Ό ν΅ν νλ‘νΌν° μμ±
μμ±λ λΉ κ°μ²΄μ thisλ₯Ό μ¬μ©νμ¬ λμ μΌλ‘ νλ‘νΌν°λ λ©μλλ₯Ό μμ±ν μ μλ€.
thisλ μλ‘ μμ±λ κ°μ²΄λ₯Ό κ°λ¦¬ν€λ―λ‘ thisλ₯Ό ν΅ν΄ μμ±ν νλ‘νΌν°μ λ©μλλ μλ‘ μμ±λ κ°μ²΄μ μΆκ°λλ€.
μμ±λ κ°μ²΄ λ°ν
λ°νλ¬Έμ΄ μλ κ²½μ°, thisμ λ°μΈλ©λ μλ‘ μμ±ν κ°μ²΄κ° λ°νλλ€. λͺ μμ μΌλ‘ thisλ₯Ό λ°ννμ¬λ κ²°κ³Όλ κ°λ€.
λ°νλ¬Έμ΄ thisκ° μλ λ€λ₯Έ κ°μ²΄λ₯Ό λͺ μμ μΌλ‘ λ°ννλ κ²½μ°, thisκ° μλ ν΄λΉ κ°μ²΄κ° λ°νλλ€.
μ΄ λ thisλ₯Ό λ°ννμ§ μμ ν¨μλ μμ±μ ν¨μλ‘μμ μν μ μννμ§ λͺ»νλ€. λ°λΌμ μμ±μ ν¨μλ λ°νλ¬Έμ λͺ μμ μΌλ‘ μ¬μ©νμ§ μλλ€.

thisμ λ°μΈλ©λ κ°μ²΄λ ν¨μ νΈμΆ ν¨ν΄μ μν΄ κ²°μ λλ€.
μ΄λ μλ°μ€ν¬λ¦½νΈ μμ§μ΄ μννλ κ²μ΄λ€.
μ΄λ¬ν μλ°μ€ν¬λ¦½νΈ μμ§μ μ묡μ this λ°μΈλ© μ΄μΈμ thisλ₯Ό νΉμ κ°μ²΄μ λͺ μμ μΌλ‘ λ°μΈλ©νλ λ°©λ²λ μ 곡λλ€.
μ΄κ²μ κ°λ₯νκ² νλ κ²μ΄
Function.prototype.apply
Function.prototype.call
λ©μλμ΄λ€.
μ΄ λ©μλλ€μ λͺ¨λ ν¨μ κ°μ²΄μ νλ‘ν νμ κ°μ²΄μΈ Function.prototype κ°μ²΄μ λ©μλμ΄λ€.
κΈ°μ΅ν΄μΌ ν κ²μ apply() λ©μλλ₯Ό νΈμΆνλ 주체λ ν¨μμ΄λ©° apply() λ©μλλ thisλ₯Ό νΉμ κ°μ²΄μ λ°μΈλ©ν λΏ λ³Έμ§μ μΈ κΈ°λ₯μ ν¨μ νΈμΆμ΄λΌλ κ²μ΄λ€.
func.apply(thisArg, [argsArray])
Person.apply(someFunc, [1, 2, 3])
Person.call(someFunc, 1, 2, 3)
// thisArg: ν¨μ λ΄λΆμ thisμ λ°μΈλ©ν κ°μ²΄
// argsArray: ν¨μμ μ λ¬ν argumentμ λ°°μ΄
function convertArgsToArray() {
console.log(arguments);
// arguments κ°μ²΄λ₯Ό λ°°μ΄λ‘ λ³ν
// slice: λ°°μ΄μ νΉμ λΆλΆμ λν 볡μ¬λ³Έμ μμ±νλ€.
var arr = Array.prototype.slice.apply(arguments); // arguments.slice
// var arr = [].slice.apply(arguments);
console.log(arr);
return arr;
}
convertArgsToArray(1, 2, 3);

No activity yet