Skip to content

Instantly share code, notes, and snippets.

@nephilim
Last active December 13, 2015 21:19
Show Gist options
  • Select an option

  • Save nephilim/4976804 to your computer and use it in GitHub Desktop.

Select an option

Save nephilim/4976804 to your computer and use it in GitHub Desktop.
Created to demonstrate one of possible problems with a sample code in chapter four of the book Javascript Patterns. For more information, refer to an example on page 100 of the book
function curry(fn) {
var slice = Array.prototype.slice;
var args = slice.call(arguments);
// curry.call(obj)의 ν˜•νƒœλ‘œ ν˜ΈμΆœν–ˆμ„ 경우
var self = this;
if (typeof(args[0]) != "function") {
// μ˜ˆμ™Έ 처리
throw { name: "ArgumentException",
message: "First argument should be a function" };
}
called_args = args.slice(1);
return function() {
// λͺ…μ‹œμ μœΌλ‘œ selfλ₯Ό μ§€μ •ν•˜μ§€ μ•Šκ³ 
// thisλ₯Ό μ‚¬μš©ν•˜λ©΄ λ°˜ν™˜λœ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” scope을 따라간닀.
args = slice.call(called_args).concat(arguments);
// 책에 μžˆλŠ” μ˜ˆμ œμ™€ 달리 captured variable인 selfλ₯Ό 전달함
return fn.apply(self, args);
};
}
var obj = {
base: 10,
add_to_base: function() {
// 인자 κ°œμˆ˜μ— 상관없이 λ™μž‘ν•˜λŠλΌ μ’€ κΈΈμ§€λ§Œ,
// κ²°κ΅­ base에 인자λ₯Ό λͺ¨λ‘ λ”ν•˜λŠ” ν•¨μˆ˜
var args = Array.prototype.slice.call( arguments, 0);
sum = this.base;
for(var i =0; i < args.length; i++) {
sum += args[i];
}
return sum;
}};
/*
var add_to_hundred = curry.call(obj, obj.add_to_base, 90)
add_to_hundred(100)
> 200
// μ±…μ˜ μ˜ˆμ œλŠ” λ‹€μŒκ³Ό κ°™μ•„μ„œ μ‹€νŒ¨ν•¨
var add_to_hundred = curry.call(null, obj.add_to_base, 90)
add_to_hundred(100)
> NaN
*/
@outsideris
Copy link
Copy Markdown

var a = function() {return this.age;}
a.curry().apply({age:5})
a.curry().apply({age:7})

@nephilim
Copy link
Copy Markdown
Author

μ•„λ‹Œμž λ‹˜μ˜ μ½”λ“œλŠ” λ‹€μŒκ³Ό 같이 obj의 λ¬Έλ§₯을 μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    obj.add_to_base.curry(20, 30).call(obj, 40)
    // 100

    obj.base60  = obj.add_to_base.curry(20, 30)
    obj.base60(40)
    // 100

κ°œμΈμ μœΌλ‘œλŠ” 컀리된 ν•¨μˆ˜λ₯Ό obj의 λ©€λ²„λ‘œ μ§€μ •ν•˜λŠ” 두 번째 방법이 μ’‹μ•„λ³΄μž…λ‹ˆλ‹€. ν•˜μ§€λ§Œ ν•΄λ‹Ή λ¬Έλ§₯에 λ„£μ§€ μ•ŠμœΌλ©΄ μ•ˆλ˜κ³ , call/applyλ₯Ό μ μš©ν•˜λŠ” 건 μ• μ΄ˆμ— λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€. 이건 var fn = this λ•Œλ¬Έμ΄κΈ°λ„...

thisλ₯Ό μ‚¬μš©ν•˜λŠ” λ ˆμ‹μ˜Ήμ˜ μ½”λ“œλ„ λ‚˜μ˜μ§€ μ•ŠκΈ°λŠ” ν•œλ°... μ–΄μ¨Œλ˜ 제 방법에 λ ˆμ‹μ˜Ήμ˜ function prototype을 μ μš©ν•˜λŠ” 것은 생각해보지 λͺ»ν–ˆλ„€μš”, μ±…μ˜ 예제λ₯Ό λ²—μ–΄λ‚˜μ„œ 생각해본 건 μ•„λ‹Œλ°... (λΆ€λ“€λΆ€λ“€)

@nephilim
Copy link
Copy Markdown
Author

@outsideris κ·Έλž˜λ„ μ§€κ΅¬λŠ” λˆλ‹€ κΆμ‹œλ  κΆμ‹œλ  @McTenshi 도와죠

@goonoo
Copy link
Copy Markdown

goonoo commented Feb 20, 2013

μ΄ˆλŒ€ κ°μ‚¬ν•©λ‹ˆλ‹€. γ…‹γ…‹

"μ•„λ‹Œμž"λΌλ‹ˆ "Non-person" κ°™κ΅°μš”.

λ ˆμ‹μ˜Ήμ˜ 방법은 function의 prototype으둜 ν•˜μ§€ μ•Šμ•˜μ„ λ•Œ 첫번째 μΈμžκ°€ function인지 κ²€μ‚¬ν•˜λŠ” λ‘œμ§μ„ ꡬ쑰적으둜 ν•΄κ²°ν–ˆλ‹€λŠ” 것이 μ°Έ μ•„λ¦„λ‹΅κ΅°μš”.

κ·Έλ‚˜μ €λ‚˜ 두 μ½”λ“œκ°€ λΉ„μŠ·ν•œκ±Έ λ³΄λ‹ˆ λ„€ν”Όλ¦Όλ‹˜μ—κ²Œμ„œλ„ λ‹Œμžμ˜ ν–₯κΈ°κ°€...

@outsideris
Copy link
Copy Markdown

λ§ˆμ§€λ§‰μ€„μ—.. +1 μž…λ‹ˆλ‹€.

@outsideris
Copy link
Copy Markdown

@nephilim λ‹Œμžλ‹˜μ˜ 인술이 더 κ°•λ ₯ν–ˆμŠ΅λ‹ˆλ‹€...

@nephilim
Copy link
Copy Markdown
Author

@outsideris μ „ λ‹Œμžκ°€ μ•„λ‹ˆμ—μš§! μ–΄μ¨Œκ±΄ 제 μ£Όμž₯을 이해해 μ£Όμ‹œλ‹ˆ 감사. (ν•˜μ§€λ§Œ λ ˆμ‹μ˜Ή μ½”λ“œ 보자마자 이야기 ν–ˆλŠ”λ°... μ—­μ‹œ 보고 μžˆμ§€ μ•Šμ•˜;;; )

@McTenshi 'μ•„-λ‹Œμž'λ‘œλ„ 'μ•„λ‹Œ-자'λ‘œλ„ μ½νžˆλŠ” κ΅°μš”. 두 개의 별λͺ…을 ν•œ 큐에!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment