准备改写，参照gabrielecirulli的javascript版本