+ JavaScript の質問用スレッド vol.80 +
一応、Function#name は Firefox v3.6.12, Opera v10.63, Google Chrome 7 で使えることを確認しました。(IE8 は不可)
953 :
947:2010/11/06(土) 00:15:54 ID:???
ありがと。
他言語での経験から.nameしてみたけどIE8だったので見事に無理でした。
一般公開を目的としたサイトでIEで動かないような構築をしている人ってそんなに多いの?。
クロスブラウザを考慮するなら、こんな感じかな。
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 を拡張できたら面白そうではありますが。
しまった…。匿名関数を考慮していませんでした。
匿名関数の 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コンストラクタを置き換えなくてはならず…、かなり面倒ですね。
テンプレ論議している余裕はないので、新たな提案であればそれは
次回回しということでお願いしたいです。次スレは975超えたら。
DOMじゃないからでしょ
IE はコメントを除去しないんだよなぁ
alert(function/*(*/name(){})
>>958 結局結論出なかったのかなんかで現状があるんでは。とりあえず
今スレと同じにしておいて次スレ早々に確認しませんか。
> think49
簡潔に書け
IEはコメント除去しないどころじゃない
function A, B(){
}
alert([A,B]);
function A.prototype.a(){
}
alert(new A().a);
IEだと動くんだぜコレ
>>962 いいですね。テンプレ議論をスレ最後でやるから間に合わなくなるっぽいですしね。
>>959 Window Object 1.0 (W3C Working Draft)
>>965 それを判断するのは質問者なのでは?
詳しい回答が冗長に感じる人がいれば、簡潔な回答では物足りない人もいるでしょう。
それがわからない以上、簡潔に書いても詳しく書いても同じだと私は思いますが。
IEはこうもだろ
var a = function abc(){1};
alert(abc); // "function abc(){1}"
972 :
Name_Not_Found:2010/11/06(土) 20:23:59 ID:NjpCOJce
長文はやめて欲しいが質問しまくる姿勢は尊敬するわ
嫌いじゃないわこういうの
いかにも初心者同士が教えあうって空気が
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();
}
argumentsという名前がいけない
argumentsは予約語では無いが関数を呼び出した時に
関数内で自動的に生成されるオブジェクト
生成されたオブジェクトでは呼び出し元とか引数の値等が入ってる
>>975 そういう事でしたか、納得しました。
ありがとうございます。
全くの初心者で本読んでもほとんど理解できずに居ましたが、このスレの皆さんの助言によってようやくJavaScriptを扱えるようになり、本当に助かりました
もう言葉じゃ表現出来ないほどの感謝の気持ちで一杯です
本当にありがとうございました
いいってことよ〜
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で値を束縛できることを知ったのだけど、
使わないほうがいいという事も書いてあったけど使わないほうがいい理由って何かあったりするの?
スレ立て人ですが、スレ立て規制で建てられないです…
どなたかお願いします。テンプレの変更は今回はなしですので…
デザインパターンを勉強中なのですが、JSでVisitorパターンをどういう風に実装していいか悩んでいます
型によるオーバーロードができないのでディスパッチ部分の記述がどうしても汚くなってしまいそうです
なにか良い方法はないでしょうか
デザパタといってもよく使うパターンがあってね
結論からいうとVisitorパターンなんて使わないっすよね
>>982 なるほど
なら別に実装方法を考える必要はなさそうですね
ありがとうございました
こっちが埋まってもいないのに誘導すんなタコ
お前が残りを全部埋めれば解決
>>979 with は指定したオブジェクトをスコープチェインの先頭に追加するだけだから、
・変数の名前解決の効率低下の原因になり得る
・読むときに、変数がどの時点で解決されるか分かりにくい
それに加えて、
・ES5 の strict mode では使用できない
かな。
>>979はwithで遅くなる典型例
ま、ループのたびに$("body")する時点で速度は度外視なんだろうが
うめ
| \
|Д`) ダレモイナイ・・オドルナラ イマノウチ
|⊂
|
♪ Å
♪ / \ ランタ タン
ヽ(´Д`;)ノ ランタ タン
( へ) ランタ ランタ
く タン
♪ Å
♪ / \ ランタ ランタ
ヽ(;´Д`)ノ ランタ タン
(へ ) ランタ タンタ
> タン
うめ
ume
_
モウツカレタヨ・・・
1000
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。