Почему в данном примере, при вызове 
ass.myBind(0) или 
ass.myBind(false) возвращается 
undefined?
Ведь это значения , которые интерпретируются как 
false и попадая в конструкцию 
fn.call(!this?this:obj) по идее должно получиться (true?
this:obj) - жирным выделено то, что должно вернуться результатом, Т.Е. если возвращается 
this будет выполнена привязка по умолчанию т.е. объект 
window(учитывая то, в каком месте функция вызывается). И к тому-же, если вызывать 
ass.myBind(unefined) и 
ass.myBind(null) то привзяка по умолчанию работает (т.е привязка к глобальному объекту)!
Function.prototype.myBind=function(obj){
  fn=this
    bound=function(){
        return fn.call(!this ? this : obj)
    }
    return bound
};
var a="Привязка к глобальному объекту по умолчанию",
    b={a:"Свойство 'а' из объекта b"},
    c={a:"Свойство 'а' из объекта с"},
    f //просто переменная для теста, т.к. у нее нет значения, значит она undefined
      //и соотвественно при передачи её аргументом ass.myBind(f) привязка идёт к
      //window
function ass(){
  document.write(this.a);
};
var fart = ass.myBind();
fart(); //привязка к глобальному объекту