+ JavaScript の質問用スレッド vol.80 +

このエントリーをはてなブックマークに追加
952think ◆bKk/qcAKuM :2010/11/06(土) 00:06:47 ID:???
一応、Function#name は Firefox v3.6.12, Opera v10.63, Google Chrome 7 で使えることを確認しました。(IE8 は不可)
953947:2010/11/06(土) 00:15:54 ID:???
ありがと。

他言語での経験から.nameしてみたけどIE8だったので見事に無理でした。

一般公開を目的としたサイトでIEで動かないような構築をしている人ってそんなに多いの?。
954think ◆bKk/qcAKuM :2010/11/06(土) 00:29:45 ID:???
クロスブラウザを考慮するなら、こんな感じかな。

function getFunctionName (func) {
 var functionBody;

 functionBody = /^function\s+([^\s(]+)/.exec(func.toString());
 return functionBody ? functionBody[1] : functionBody; // Function#name || null
}
var a = function abc () { ; };
console.log(a.name || getFunctionName(a));

>>953
Function#name を得る標準的な方法はないので独自拡張に頼るしかないんだと思います。
IE8- はまともな方法では得られないんじゃないかな…。(IE9 はわかりませんが)

# Function.prototype.name を拡張できたら面白そうではありますが。
955Name_Not_Found:2010/11/06(土) 00:36:08 ID:???
>>954
参考になります
956think49 ◆bKk/qcAKuM :2010/11/06(土) 01:01:47 ID:???
しまった…。匿名関数を考慮していませんでした。
匿名関数の Function#name は空文字を返すようです。(Google Chrome 7 で確認)

var a = function () { ; };
console.log('"' + a.name + '"'); // ""

というわけで、>954の修正版。

function getFunctionName (func) {
 var functionBody;

 functionBody = /^function\s+([^\s(]*)(?=\()/.exec(func.toString());
 return functionBody ? functionBody[1] : null; // Function#name || null
}
var a = function () { ; };
console.log('"' + getFunctionName(a) + '"'); // ""

本来は IdentifierName 生成規則に沿った方がいいと思いますが、解読に時間がかかりそうだったので省略しました。
http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/7_Lexical_Conventions.html#Identifier
http://sideshowbarker.github.com/es5-spec/#x7.6

# Function.prototype.name を拡張するためにはFunctionコンストラクタを置き換えなくてはならず…、かなり面倒ですね。
957Name_Not_Found:2010/11/06(土) 08:59:55 ID:???
テンプレ論議している余裕はないので、新たな提案であればそれは
次回回しということでお願いしたいです。次スレは975超えたら。
958Name_Not_Found:2010/11/06(土) 10:42:38 ID:???
>>944
ここらへんは?
あと、vol.77あたりであったのは、無かったことでいいのかな。
+ JavaScript の質問用スレッド vol.77 +
http://pc11.2ch.net/test/read.cgi/hp/1268206233/841-
959Name_Not_Found:2010/11/06(土) 10:47:51 ID:???
960Name_Not_Found:2010/11/06(土) 11:44:51 ID:???
DOMじゃないからでしょ
961Name_Not_Found:2010/11/06(土) 14:15:30 ID:???
IE はコメントを除去しないんだよなぁ

alert(function/*(*/name(){})
962Name_Not_Found:2010/11/06(土) 14:37:49 ID:???
>>958
結局結論出なかったのかなんかで現状があるんでは。とりあえず
今スレと同じにしておいて次スレ早々に確認しませんか。
963Name_Not_Found:2010/11/06(土) 15:56:45 ID:???
>>959
HTML5のドラフトを見るんだ。
964think49 ◆bKk/qcAKuM :2010/11/06(土) 17:34:18 ID:???
>>959
例えば、window.alert は MDC では "DOM Level 0" と説明されています。

---
仕様
DOM Level 0。どの標準にも属しません。
https://developer.mozilla.org/ja/DOM/window.alert
---

---
"DOM Level 0"
"DOM Level 0" は W3C が DOM の標準化を始める前にブラウザ間で共通だったオブジェクトモデルです。

・Netscape の クライアントサイド JavaScript ガイド(Javascript と "DOM Level 0" を扱います)
・Netscape の クライアントサイド JavaScript リファレンス(Javascript と "DOM Level 0" を扱います)
・JavaScript スクリプティングリソース - "ダイナミック HTML" と JavaScript に関するさまざまなサイトへのリンク
http://www.mozilla-japan.org/docs/web-developer/#scripting
---

"DOM Level 0" は DOM 仕様としては策定されていませんが、デファクトスタンダードとして確立されている仕様を指します。
(実際には window.open を IE が独自拡張していたりしますが、概ね全てのブラウザで同じ挙動を示します。)
この辺りの曖昧さは HTML5 で標準化される予定です。
W3C の HTML5 は http://www.w3.org/TR/html5/ にありますが、まだ最終草案段階なので WHATWG ( http://whatwg.org/html5 ) の方が最新の情報が手に入ります。

6.2 The Window object
http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html#the-window-object

HTML5 はAudioオブジェクトなど新しい技術が注目されがちですが、実際にはデファクトスタンダードとして確立された仕様を改めて標準化しているものも数多く含んでいます。
少し前に話題になった innerHTML もそうです。innerHTML は標準化こそされていませんでしたが多くのブラウザで(ほぼ)同じ振る舞いをします。
これらは既にあるブラウザの実装に合わせて HTML5 で標準化されているので、未だ最終草案段階とはいえ勧告までに大きな変更があるとは思えません。
965Name_Not_Found:2010/11/06(土) 17:44:31 ID:???
> think49
簡潔に書け

IEはコメント除去しないどころじゃない
function A, B(){
}
alert([A,B]);
function A.prototype.a(){
}
alert(new A().a);
IEだと動くんだぜコレ
966Name_Not_Found:2010/11/06(土) 18:03:54 ID:???
>>962
いいですね。テンプレ議論をスレ最後でやるから間に合わなくなるっぽいですしね。
967Name_Not_Found:2010/11/06(土) 18:31:24 ID:???
>>959
Window Object 1.0 (W3C Working Draft)
968think49 ◆bKk/qcAKuM :2010/11/06(土) 18:59:00 ID:???
>>965
それを判断するのは質問者なのでは?
詳しい回答が冗長に感じる人がいれば、簡潔な回答では物足りない人もいるでしょう。
それがわからない以上、簡潔に書いても詳しく書いても同じだと私は思いますが。
969Name_Not_Found:2010/11/06(土) 19:00:55 ID:???
IEはこうもだろ
var a = function abc(){1};
alert(abc); // "function abc(){1}"
970Name_Not_Found:2010/11/06(土) 19:01:38 ID:???
>>968
独自研究は他所でやれ
971Name_Not_Found:2010/11/06(土) 20:09:39 ID:???
972Name_Not_Found:2010/11/06(土) 20:23:59 ID:NjpCOJce
長文はやめて欲しいが質問しまくる姿勢は尊敬するわ
973Name_Not_Found:2010/11/06(土) 20:26:19 ID:???
嫌いじゃないわこういうの
いかにも初心者同士が教えあうって空気が
974Name_Not_Found:2010/11/07(日) 07:46:53 ID:???
load("url",false,funcname,"string");で呼んだ場合に2つ目のalert(arguments);がobjectに
なってしまうのですがこれはどうしてでしょうか?。

function load(url, async, callback, arguments) {
alert(arguments);//
m_xmlhttp.open("GET", url, async);
m_xmlhttp.onreadystatechange = function() {
if (m_xmlhttp.readyState == 4 && m_xmlhttp.status == 200) {
alert(arguments);//
callback(m_xmlhttp.responseText, arguments);
}
}
m_xmlhttp.send();
}
975Name_Not_Found:2010/11/07(日) 10:01:58 ID:???
argumentsという名前がいけない
argumentsは予約語では無いが関数を呼び出した時に
関数内で自動的に生成されるオブジェクト
生成されたオブジェクトでは呼び出し元とか引数の値等が入ってる
976Name_Not_Found:2010/11/07(日) 10:12:46 ID:???
>>975
そういう事でしたか、納得しました。
ありがとうございます。
977Name_Not_Found:2010/11/07(日) 13:06:46 ID:???
全くの初心者で本読んでもほとんど理解できずに居ましたが、このスレの皆さんの助言によってようやくJavaScriptを扱えるようになり、本当に助かりました
もう言葉じゃ表現出来ないほどの感謝の気持ちで一杯です
本当にありがとうございました
978Name_Not_Found:2010/11/07(日) 13:19:01 ID:???
いいってことよ〜
979Name_Not_Found:2010/11/07(日) 19:20:18 ID:???
for(var i = 0; i<5 ; i++){
  var a = $(document.createElement("div"));
  with({i:i}){
    a.click = function(){ alert(i); };
  }
  a.text("Withのてすと");
  $("body").append(a);
}
>>781-あたりでブロックスコープについての話題があったから調べてみたらwithで値を束縛できることを知ったのだけど、
使わないほうがいいという事も書いてあったけど使わないほうがいい理由って何かあったりするの?
980Name_Not_Found:2010/11/07(日) 19:41:58 ID:???
スレ立て人ですが、スレ立て規制で建てられないです…
どなたかお願いします。テンプレの変更は今回はなしですので…
981Name_Not_Found:2010/11/07(日) 20:01:58 ID:???
デザインパターンを勉強中なのですが、JSでVisitorパターンをどういう風に実装していいか悩んでいます
型によるオーバーロードができないのでディスパッチ部分の記述がどうしても汚くなってしまいそうです
なにか良い方法はないでしょうか
982Name_Not_Found:2010/11/07(日) 20:03:56 ID:???
デザパタといってもよく使うパターンがあってね
結論からいうとVisitorパターンなんて使わないっすよね
983Name_Not_Found:2010/11/07(日) 20:06:06 ID:???
>>982
なるほど
なら別に実装方法を考える必要はなさそうですね
ありがとうございました
984Name_Not_Found:2010/11/07(日) 20:37:54 ID:???
>>981
JSについてはこの人の言うこと聞いておいていいと思うよ
http://blog.livedoor.jp/dankogai/archives/51066288.html

んじゃトイレ行って一休みしたら次スレ立ててくる
985Name_Not_Found:2010/11/07(日) 20:38:12 ID:???
間違えた>>981じゃなくて>>979
986Name_Not_Found:2010/11/07(日) 20:55:49 ID:???
移動ぷりーず

+ JavaScript の質問用スレッド vol.81 +
http://hibari.2ch.net/test/read.cgi/hp/1289130738/
987Name_Not_Found:2010/11/07(日) 20:57:17 ID:???
こっちが埋まってもいないのに誘導すんなタコ
988Name_Not_Found:2010/11/07(日) 21:02:35 ID:???
お前が残りを全部埋めれば解決
989Name_Not_Found:2010/11/07(日) 21:31:35 ID:???
>>986
990Name_Not_Found:2010/11/07(日) 22:22:18 ID:???
>>979
with は指定したオブジェクトをスコープチェインの先頭に追加するだけだから、

・変数の名前解決の効率低下の原因になり得る
・読むときに、変数がどの時点で解決されるか分かりにくい

それに加えて、

・ES5 の strict mode では使用できない

かな。
991Name_Not_Found:2010/11/07(日) 22:44:52 ID:???
>>990
なるほどありがとう
992Name_Not_Found:2010/11/08(月) 01:58:03 ID:???
>>979はwithで遅くなる典型例
ま、ループのたびに$("body")する時点で速度は度外視なんだろうが
993Name_Not_Found:2010/11/08(月) 21:32:51 ID:???
うめ
994Name_Not_Found:2010/11/08(月) 21:40:22 ID:???
   | \
   |Д`) ダレモイナイ・・オドルナラ イマノウチ
   |⊂
   |


     ♪  Å
   ♪   / \   ランタ タン
      ヽ(´Д`;)ノ   ランタ タン
         (  へ)    ランタ ランタ
          く       タン



   ♪    Å
     ♪ / \   ランタ ランタ
      ヽ(;´Д`)ノ  ランタ タン
         (へ  )    ランタ タンタ
             >    タン
995Name_Not_Found:2010/11/09(火) 01:25:26 ID:???
うめ
996Name_Not_Found:2010/11/09(火) 08:19:36 ID:???
997Name_Not_Found:2010/11/09(火) 19:51:57 ID:???
ume
998Name_Not_Found:2010/11/09(火) 19:54:02 ID:???
_
999Name_Not_Found:2010/11/09(火) 19:57:12 ID:???
モウツカレタヨ・・・
1000Name_Not_Found:2010/11/09(火) 20:00:04 ID:???
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。