6 ms·
Many interviewees, when presented with `say("hello")("world")`, understood that `say` was a function that returned a function, but few were able to actually imp
by Xavi 16y ago
Many interviewees, when presented with `say("hello")("world")`, understood that `say` was a function that returned a function, but few were able to actually implement `say`.
- erikwiffin 16y agoI like this question, and I've got something that works, but I'm not sure it's the prefered solution. function say(arg) { return function(word) { alert(arg + " " + word); }; } It solves "hello world", but wouldn't work for something like say("dogs")("and")("cats"). Are you expecting an arbitrary number of function returns?
- noblethrasher 16y agoAccording to the expected output, you'd need something like: function say(x) { return function (y) { alert( capitalize(x) + " " + capitalize(y)); } } Where capitalize makes the first character uppercase.
- Xavi 16y agoOops, that's a type-o. The capitalize doesn't need to change. Thanks for the heads up.
- Xavi 16y agoYep, that is exactly the solution I would be looking for. I would be blown a way if someone came up with solution that could handle arbitrary function returns. My friend actually wrote an interesting article on the subject. Here's the link if you're interested: http://msdn.microsoft.com/en-US/scriptjunkie/gg575560.aspx http://msdn.microsoft.com/en-US/scriptjunkie/gg575560.aspx
- jaysoo 16y agoNot exactly the same signature, but can handle arbitrary number of calls. var say = (function() { var savedArgs = []; return (function recurse () { if (arguments.length) { for (var i=0, arg; arg=arguments[i]; i++) { savedArgs.push(arg); } return recurse; } else { alert(savedArgs.join(' ')); savedArgs = []; } }); })(); // e.g. say('Hello')('World')('!!')(); // --> alerts "Hello World !!"
- sibsibsib 16y agohere's the version I came up with, based on one I did in python. It's very similar to jaysoo's - needs a call with no args to terminate the list. I'm curious if there's a way to do this somehow without the terminator. I'm not a JS expert by any means, so if I'm doing something stupid in this code, I'd love to know. var say = function(word) { words = [word]; func = function(word2) { if (word2) { words.push(word2); return func; } else { print(words.join(' ')); } } return func; }; say('hello')('bob')('how you doing?')(); *note I have the function 'print' aliased to console.log for convenience.