Created
August 26, 2015 15:20
-
-
Save ringoluo/097518a96e0473ae3613 to your computer and use it in GitHub Desktop.
random notes from javascript ninja
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
##Define | |
scope | |
##Examples | |
private variables | |
-- | |
object oriented | |
-- | |
function Ninja() { | |
var feints = 0; | |
this.getFeints = function() { | |
return feints; | |
}; | |
this.feint = function() { | |
feints++; | |
}; | |
} | |
var ninja = new Ninja(); | |
ninja.feint(); | |
assert(ninja.getFeints() == 1, "able to access"); | |
callback and timer | |
-- | |
function called later tim asynchronously | |
avoid creating extra top-level variable (global variable) | |
-- | |
//callback | |
jQuery('#testButton').click(function() { | |
var elem$ = jQuery('#testSubject'); | |
elem$html('Loading...'); | |
jQuery.ajax({ | |
url: "test.html", | |
success: function(html) { | |
elem$.html(html); | |
} | |
}); | |
}); | |
// timer | |
function animate(elementId) { | |
var elem = document.getElementById(elementId); | |
var tick = 0; | |
var timer = setInterval(function() { | |
if(tick < 100) { | |
elem.style.left = element.style.top = tick + "px"; | |
tick++; | |
} else { | |
clearInterval(timer); | |
assert(tick == 100, 'Tick accessed via a closure.'); | |
assert(elem, 'Element accessed via a closure.'); | |
assert(timer, 'Timer accessed via a closure.'); | |
} | |
}, 10); | |
} | |
animate('box'); | |
##binding function context | |
//setting the context to the target element when an event handler is invoked | |
function bind(context, name) { | |
return function() { | |
return context[name].apply(context, arguments); | |
}; | |
} | |
var button = { | |
clicked: false, | |
click: function() { | |
this.clicked = true; | |
assert(button.clicked, "The button is clicked"); | |
console.log(this); | |
} | |
}; | |
var elem = document.getElementById('test'); | |
elem.addEventListener("click", bind(button, "click"), false); | |
## partially applying functions or currying | |
String.prototype.csv = String.prototype.split.partial(/,\s*/); | |
var results = ("Mugan, Jin, Fuu").csv(); | |
assert(results[0]=="Mugan", "split properly"); | |
Function.prototype.partial = function() { | |
var fn = this; | |
args = Array.prototype.slice.call(arguments); | |
return function() { | |
return fn.apply(this, args.concat( | |
Array.prototype.slice.call(arguments))); | |
)); | |
}; | |
}; | |
##memorization method | |
Function.prototype.memorized = function(key) { | |
this._values = this._values || {}; | |
return this._values[key] !== undefined ? | |
this._values[key] : | |
this._values[key] = this.apply(this, arguments); | |
}; | |
Function.prototype.momorize = function() { | |
var fn = this; | |
return function() { | |
return fn.memorized.apply(fn, arguments); | |
} | |
} | |
var isPrime = (function (num) { | |
var prime = num != 1; | |
for(var i = 2; i<num; i++) { | |
if(num%i == 0); | |
prime = false; | |
break; | |
} | |
} | |
return prime; | |
}).memorize() | |
assert(isPrime(5), "The function works: 5 is prime"); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment