素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: twitter: @javascripter にどうぞ。

ラベル付きbreak

普通だったら一時変数にフラグを立てなきゃいけないような場面でも、ラベル付きbreakを使えば一気に多重ループから抜け出すことができる。
例えば、高速なgetElementsByClassName - 素人がプログラミングを勉強するブログをこの構文を使って書き直すと、flagという変数を使って分岐する必要がなくなる。

if (typeof HTMLElement.prototype.getElementsByClassName!="function")
  HTMLElement.prototype.getElementsByClassName=function(className) {
    var names=className.split(/\s+/),
    all=this.getElementsByTagName("*"),
    memo={},
    ret=[];
    for(var i=0,l=all.length,elem,iname;i<l;i++) findElem:{
      elem=all[i];
      iname=elem.className;
      if (!(iname in memo))
        memo[iname]=" "+iname.toLowerCase()+" ";
      for (var j=0,jname;j<names.length;j++) {
        jname=names[j];
        if (!(jname in memo))
          memo[jname]=" "+jname.toLowerCase()+" ";
        if(memo[iname].indexOf(memo[jname])!=-1)continue;
        else break findElem;
      }
      ret[ret.length]=elem;
    }
    return ret;
  }
if (typeof document.getElementsByClassName!="function")
  document.getElementsByClassName=function(className) {
    return document.documentElement.getElementsByClassName(className);
  }