1999年のMLBドラフト4巡目でテキサス・レンジャーズから指名を受け、プロ入り。2002年4月9日にメジャーデビューを果たした。2002年は新人選手ながら110試合に出場し、15本塁打を放った。その活躍が評価され、ルーキー・オブ・ザ・イヤーの投票で7位に入った。2003年は故障で離脱したが、2004年はレンジャーズで復活、125試合の出場で26本塁打を放った。2005年6月30日にはメジャータイ記録となる3イニング連続本塁打を記録。7月8日には、当時12勝4敗・防御率2.33とサイ・ヤング賞最有力候補だったロイ・ハラデイの足に打球を直撃させ、シーズン後半を棒に振らせている。2006年には、シーズン序盤の4月21日から4月28日にかけて、右打者としてはメジャー史上初の7試合連続本塁打を放つ活躍を見せたがその後に失速し、同年7月26日にレンジャーズの球団通算5万本目のヒットを放った2日後、ミルウォーキー・ブルワーズにトレード移籍した。2007年シーズン終了後はFAとなり、古巣のレンジャーズとマイナー契約。その後、2008年5月9日にトロント・ブルージェイズへトレードされメジャー復帰を果たした。同年12月24日、ルー・フォードの後釜を探していた阪神タイガースと年俸1億8,000万円で契約。阪神は総額4億円の2年契約を掲示したが、メンチはそれを断り1年契約を結んだ。当時阪神監督であった岡田彰布によれば、2007年頃にもメンチが阪神の獲得リストに挙がりながら、金額面で見送られていた。しかも、岡田が退任する予定ではなかった2008年9月の時点で、現場サイドでは翌年の獲得候補としてネルソン・クルーズを検討していた。実際にメンチを獲得した真相は不明だが、フロントの担当者が現場を無視して「メンチを使え」と強制したわけではなく、球団社長の南信男も「（フロントの担当者は）そんな人物ではない」と断言している。
ここでは、名前空間はソースコード上で冗長な命名規則を用いなくても名前の衝突が起こらないようにし、しかもそれを容易に記述できるようにするためだけの概念であり、普通はそれ以上の意味は持っていない（上記の地名のたとえは行政上の管轄としての意味合いがあるが、プログラム言語の名前空間には一意な名前という以上の意味合いはない）。Javaの機能、「パッケージ」では名前空間とアクセス制限、ソースファイルのディレクトリ構造の表現の機能を統合しているが、C++やC#の「純粋な」名前空間はクラスやそのメンバのアクセス制限とは無関係である。Cには名前空間を複数に分割する機能が無く、名前の衝突を避けるためにはなんらかの命名規則を用いる必要がある。通常は文脈によって定まる名前空間が暗黙に指定される。指定したい実体に対応する名前が他の名前空間にある場合は、名前空間と名前を明示的に組み合わせることで一意に特定できる。たとえば名前bazは集合Aの中ではデータ型を表し、集合Bでは変数を表すというように指定する。次はC++/Java/C#用の擬似コードによる例である。void baz() {}int baz;void Main() {    baz = 100;}この例では同じbazという名前を持つ関数と変数が宣言されているが、関数と変数の名前空間は暗黙的に分けられているので名前の衝突は起こらない。関数Main内に記述された名前bazには=演算子によって数の代入がされており、処理系はそれが変数名であると推定できる。ただし、CやSchemeなど関数名と変数名の名前空間が分けられていない言語もあり、そのような言語では値が束縛された名前で関数を呼び出そうとするとエラーになる。上の例の変数名と関数名のように、文脈によって暗黙に名前空間が区別できるならば（それが望ましいかどうかは別として）同じ名前を使用することができる。しかし、一つの名前空間の中で同名の関数を定義すると問題が発生する。次のように同じ名前の関数、Hogeを2つ定義したとする。void Hoge() {}void Hoge() {}void Main() {    Hoge();}この場合、関数Main内のHogeという名前の関数の呼び出しはどちらの関数なのか区別できず、処理系は名前が曖昧だとしてエラーを出す。特に複数のチームで開発を行っていると名前の衝突が起きやすい。次の例は、別々のチームで書かれた二つの関数Hoge()の名前の衝突を避けるため、関数名の先頭に「チーム名_」とつけるように取り決めた場合のものである。void TeamA_Hoge() {}void TeamB_Hoge() {}void Main(){   TeamA_Hoge();   TeamB_Hoge();}これでも名前の衝突は避けられるが、呼び出しでは常にチーム名まで含めた名称で記述しなければならないため、記述も面倒でソースコードは読みにくくなってしまう。また、両方の関数をincludeしないような時には名前の衝突は起こらず、せっかくの命名規則も取り越し苦労に終わってしまう。このような場合は、2つのクラスHogeを別々の名前空間に入れる。namespace TeamA {    void Hoge() {}}namespace TeamB {    void Hoge() {}}void Main() {    TeamA.Hoge();    TeamB.Hoge();}こうすると、上の関数Hogeの名前はTeamA.Hoge、下の関数Hogeの名前はTeamB.Hogeとなり、両者を区別できるようになる。複数のチームで開発を行う場合は、チームごとに使用する名前空間を決めておけば名前の衝突は起こらないので、それぞれのチームが自由に名前を付けることができる。しかし、ひとつのソースコード中でTeamA.HogeとTeamB.Hogeの片方だけを使う場合は、完全限定名での記述は冗長な表現となってしまう。そのような場合は、C++やC#ではusingキーワードを使うことで、単純名のみの記述が使える。using TeamA;void Main() {    Hoge();}処理系はusingディレクティブから単純名Hogeの完全限定名がTeamA.Hogeであることを推定し、単純名Hogeは完全限定名TeamA.Hogeに補完されてコンパイルが成功する。また、同一の名前空間内からの呼び出しでは単純名は自動的に補完されるため、常に単純名で記述することができる。下の例では、関数Hogeと関数Mainは同一の名前空間TeamAに属しているため、関数Mainからは単純名での記述で関数Hogeを呼び出すことができる。namespace TeamA {    void Hoge() {}    void Main() {        Hoge(); //TeamA.Hogeの呼び出しだとみなされる    }}