+ JavaScript の質問用スレッド vol.115 +
JavaScript を自ら学ぶ人のための質問スレッドです。
>>2-5のテンプレを読んだ上で質問してください。
■質問を書く上で
(1) 煽り、コード制作依頼等、人を不快にさせる投稿はご遠慮下さい。公序良俗を守った応対を心がけてください。
(2) 他の人に迷惑をかけるスクリプトの質問はご遠慮ください。
(ブラクラ、[戻る], [閉じる], [クリック] の妨害、画面占有など)
(3) 質問者及び議論を行う人はメール欄を空欄にし、名前にレス番を入れることを強く推奨します。
回答者はなりすましを判断できませんので、なりすましが現れても自己責任となります。
(4) 常に自発的に調べる心構えを持ってください。
具体的には「自分で調べてから質問する」「回答をもらってわからない単語があればGoogle検索してみる」など。
わからない内容を代わりに調べてくれる回答者をお望みの方は余所で質問してください。
(5) 出来るだけ一般的な用語を使用してください。脳内オレオレ用語は混乱の元です。
(6) 出来るだけサンプルコードを掲示してください。言葉による説明は行き違いが生まれる場合があります。
※必ず「問題の事象が再現されること」を確認してください。
必要な部分だけ切り出したつもりで現象が再現できていなかったケアレスミスがしばしば見られます。
(7) サンプルコードに HTML が含まれる場合は
http://validator.w3.org/ で [Check] してみてください。
(8) 質問を具体的かつ詳細に書くと回答を得られやすいです。
>>2の質問テンプレートを活用してみてください。
(9) ライブラリ関連の質問は禁止ではありませんが、ライブラリスレで聞くとより回答を得やすいかもしれません。
(10) 時にはあなたが望む「答え」だけでなく、「意見」などが寄せられる場合もあります。
■主要FAQ (全部は
http://fiddle.jshell.net/vSqKr/33/show/ )
Q1. 別窓・フレーム内容やローカルファイルを読み書きしたいのですが…
A1. 別サーバのページやファイルの内容はセキュリティ制約でアクセス不可です。
Q2. document.write()でページ内容を追加したいのですが…
A2. 一度表示完了後にwriteするとページ内容が消去されます。DOM等別手段を。
Q3. table内容のinnerHTMLやDOMでの変更がうまく行かないのですが…
A3. IEではtable/tbody/trのinnerHTML書き換え不可です。DOMを使いますが、
DOMの場合tableの直下にはtbody要素が(作らなくても)あることに注意。
Q4. フォーム部品名を変数にした「...myform.変数名.value」が動きません…
A4. 「document.forms.myform.elements[変数名].value」でどぞ。
JavaScriptでは一般に「obj.x」と「obj['x']」は同じ意味です。
グローバル変数はwindowのプロパティなので「x」と「window['x']」も。
Q5. CSSで設定した背景色がe.style.backgroundColorで取得できないのですが…
A5. 取得には document.defaultView.getComputedStyle() を使う必要あり。
IEでは要素オブジェクトのプロパティcurrentStyleを使う。
Q6. setAttribute("class","foo")、setAttribute("onclick","bar()")が動きません…
A6. IEではそれは不可。「obj.className="foo"」「obj.onclick=bar」でどぞ。
Q7. タイマーやイベントハンドラに設定するコードにthisを含めたいのですが
「"...this..."」とか「function(){...this...}」ではうまく行きません。
A7. 実行時にthisが別のものを指してしまってる。以下のようにthisを束縛保存。
「function(x){return function(){...x...};}(this)」
Q8. input type="file"の値を設定(参照)できないのですが…
A8. セキュリティ制約のため設定は絶対に不可。参照はブラウザにより不可。
Q9. getElementById('ID名')や$('ID名')で要素が取れないのですが…
A9. コード実行時点でHTMLがそこまで読まれてない。window.onload 中でやるとか。
>>1乙
dom要素へのidの設定はsetAttributeを使うのとidプロパティへの代入と
どっちがいいんですか?
関数の中で関数を定義している場合
親関数が呼ばれるたびに子関数は再定義されるのでしょうか?
onscrollハンドラが、スクリプトによるscrollでも反応します
しかし、タイミング的に反応して欲しくない時があります
一時的にハンドラを無効にするいい方法はないでしょうか?
>>9の件ですが、bindFirstプラグインで別のハンドラを上に登録し、そこでイベントをstopし、
反応してほしくない期間が終わったらその蓋ハンドラを削除するというウルテクを思いつき
うまくいきました
もっといい方法はあるでしょうか?
>>9 もっといいかどうかわからんが
その期間中ハンドラの中で条件分岐とか
removeEventListner+addEventListenerとか
別のハンドラでcapture+stopPropagationとか
これらの組み合わせなど
テクと言うほどでもない方法はある
コールバック関数を使ったプログラミングでは
後で実行されるコードを先に書いたりして、すごく見にくくなります
コールバック関数の中で更にコールバック関数を使ったりすると更にごちゃごちゃになります
見やすくする方法はないでしょうか?
ぼくもちょうどそれを質問しようとしたのでしりたいです
簡単なものは今までは↓の感じでやっていました
var _to = {};
_to.print = function(a) { console.log(a); };
_to.abs = function(a) { return Math.abs(a); };
function sum(a,b,callback,callback_name,callback2,callback2_name) {
return callback[callback_name](a+b,callback2,callback2_name);
};
sum(1,-3,_to,'print'); // -2
console.log(sum(1,-3,_to,'abs')); // 2
sum(1,-3,_to,'abs',_to,'print'); // 2
>>12 あるよ。 「javascript 非同期ライブラリ」でぐぐれば
いろんな人が分かりやすく教えてくれてる。
>>13 君はまず、いいライブラリを使って見る必要があるね。
lodashとかピッタリだろう。
よく考えられて作られたライブラリは
どのような使い方をするのか勉強すれば
自分でも作れるようになるだろう。
前スレ >996
エスケープの意味がわからないが、一般的に、
人が入力するデータは、間違いが多いから、
入力チェックや訂正をする
>>8 再定義ってどういう意味?
>>9 イベントを処理しないのなら、
ハンドラの冒頭で、即リターンすれば?
質問なのかよくわからないんですが
JavascriptやjQueryにオススメのテキストエディタってありますか?
どうみても質問です
本当に
Win7 サクラエディタ、NotePad++
Win8 TeraPad
やっぱ、IDEじゃないと、プロパティなどの補完が効かない
21 :
16:2014/05/04(日) 17:19:42.25 ID:???
個人的に「あれ?あの関数なんていったっけ?ti・・・ti・・・」→time()
って予測変換で教えてくれるのがあればいいなーって思ってます
単語補完とかスニペットとかのキーワードでググると吉。
sublime text2で出来る
B級以上のJavaScripterはみんな使ってるよ
24 :
16:2014/05/04(日) 18:27:11.83 ID:???
うおおおおsublimetextっての調べてみたらコレは凄い
これです、こんなの探してましたありがとうございます
これでフリーだなんて世の中凄いものがあるもんですね
IE6-11
Fire最新
Google最新
で動作する
文字サイズを変更した時のイベントをキャッチしてアラートだしたいのだがリファレンス見ても文字サイズ変更のイベントがのっとらん
このままでは
非表示のテキスト入りオブジェクトをクリエイトしたのち
セットタイムアウトで関数を何度も呼び出してして要素の高さが変わったらアラート
と言うことをしなければならない
なんかセットタイムアウトを使わない良い方法あるか?
もちろんセットインターバルもなしで
そんなイベント聞いたことないな
多分ないよ
配列で返ってきた返り値を直接スカラー変数に代入することはどうやってもできないでしょうか?
ES6では出きるそうですが、ES3で。
見通しが悪くなるから一時変数は減らしたいんですよね〜
関数言語的アプローチもそういうところから来てるんですかね
PCが時間とともに進化していくのは必然
ということはあらゆるコードは自動的に高速化していくということ
だとするならば、筋のいいコードとは、見やすく保守性の高いコードではないだろうか?
むろん何度も深いスコープの変数にアクセスするよりは、一度ローカル変数に代入した方が
見やすく保守性もあがるので、ローカル変数に代入するという方針は基本的には正しいが、
速度面で避けていた関数言語的アプローチも、保守性の面からは採用すべきかもしれない。
ブラケットって少し前にこのスレに話題になった時に試したけど
sublimeをパクろうとして失敗したくそエディターじゃん
今はマシになったの?
>>25 iframe in フレームのスクロール変化でどや?!
setTimeoutで呼ばれた関数の中から
またsetTimeoutで同じ関数を呼ぶ
ということを繰り返したら、スタックは増加しますか?
setTimeoutで遅れて呼ぶので、スタックの増加はないと思っていたのですが
妙なかくつきがあり、もしかしてスタックが積まれすぎてるせいでは?と思ったのです
>>33 setTimeout自体は何も評価せずスケジュールだけ組んで即時に戻るから
コールスタックは積まれない
かくつきは一般的にそのスケジュールが
何か他の処理よりも後回しにされている
または他の処理にブロックされていることを意味する
>>34 やっぱり積まれませんよね
ありがとうございます
>>32 フレームか
JSで扱ったこと無いわ
ちょっとググってみる
ありがと
>>28 たしかにそうかも
LEGACY用の処理とか、無駄なのがいつまでも残ってたりするし
いまだに//NN4とかw
???
古い時代に書いたコードの話とは関係ないんだが
むしろ、そういうのを一々正すほうが無駄だろ
お前は過去に書いたコードを永久にサポートできるのか?
それともお前の知り合いに未だにNN用コードを新規で書く奴が要るのか?
それを一々気にするのが一番の無駄だが
ふむふむ
前の会社が運営していたサイトはメンテもしないで思いまんま使うと
なるほど、それなら楽でいいですね
40 :
Name_Not_Found:2014/05/05(月) 16:15:12.05 ID:4bZ+ZE3M
運営とコードメンテは普通別会社か別部署じゃね?
少なくとも一人の開発者がメンテするかどうかまで決める訳じゃないし関係ないことだ。
保守を別会社にやらせるのは時代遅れ。
いまは保守を抱えることで、顧客が気がつく前に改善点を見つけ出し、
そこから能動的に提案活動につなげるのが主流だよ。
lodashの_.maxってMath.maxよりいいんですか?
lodashに_.isUndefinedがありますが
それならundefinedを返す_.undefinedみたいな関数も必要じゃないですか?
>>43 標準で用意されている機能をライブラリで用意する必要はない
それならisUndefinedやisNullもいらないのでは
>>45 はっきり言って不要だと思うが、リファレンスを読む限りではis系を全て揃えるポリシーがあるのだろう
また、Lo-Dashは定数を返すメソッドorプロパティを作らないポリシーなのだろう
undefined だけでなく、NaN, infenety..を返す機能も用意されていない
http://lodash.com/docs 正直、開発ポリシーを開発者ではない俺に聞かれても困るんだが
そんなことは作者に直接提案するなり、質問するなりすべきではないのか
定期的にこっちでlodashの話題振ってるのは前暴れたあれにしか見えん
idの配列と、idをキーに持ったオブジェクトがあります
オブジェクトから、配列に含まれるキーのものだけを抜き出してあらたなオブジェクトを作るのに、
lodashを使い
_(idList).mapValues(function(id) {
return object[id];
});
という書き方に辿り着きました
これ以上シンプルな書き方はありますか?
>>48 そのものずばりな_.pickというのがある
なんと
ありがとうございました
ちなみに上記の例はmapValuesではなくmapで、
そして_(idList)のようなオブジェクト指向風の書き方だと結果もlodashオブジェクトになってしまうという
不具合がありました
lodashにはデフォルトのfor inのように
キーだけを回す関数はないのでしょうか?
forInなどはキーと値をセットで回すようになっています
しかしキーだけが欲しい場合、使わない値を渡すとjshintでエラーになります
keysでキー配列を作ってからforEachすれば目的は達成できますが
こういうやり方しかないのでしょうか?
>>47 lodashの話題がでただけでいつも過剰反応するのは
お前かい?w
>>43 > lodashに_.isUndefinedがありますが
> それならundefinedを返す_.undefinedみたいな関数も必要じゃないですか?
必要ない。 なぜならundefinedは代入されていない状態であり、
undefindを変数に代入するというコードは
書いてはいけないものだから。
代入することはないから、_.undefinedは不要だが
チェックすることはあるので、_isUndfinedは必要。
JavaScript標準のやり方をしないのは、コードに説明が必要なものだから
説明が必要なもの=複雑ということ=絶対に間違える。
_とか付いてんの? 糞ライブラリだな
C言語では、_関数はgettext用だよ。
クソっていうのは、名前のことじゃないよね。
>undefindを変数に代入するというコードは
>書いてはいけないものだから。
引数がない時のチェックはundefinedか否かでするから
渡さないことにしたい時のためにundefinedを代入することがあるよ
>>56 引数チェックは arguments.length 判定が好ましい
>>40 別会社に運営任せるとぐだぐだになるなんて、よくある話
別部署だってヤバいのにw
俺も_の宣伝というか、人の作ったものの良さを分かる俺ってスゲーでしょっていう
構ってちゃんのアピールには嫌気がさしてきてるが構わないのが一番
>>56-57 引数のチェックはarguments.lengthとundefined両方の確認が必要
具体的にはES6に合わせるべき
つまりデフォルトパラメータ的なチェックではundefinedかどうか
レストパラメータ的チェックではarguments.lengthを見る必要がある
ただし、変数にundefinedを代入するのは結構挑戦的な行為だとは思う
悪いとは言わない
lodashの2.5.0ってまだでないのかな?
たしか文字列系が増えてるから
楽しみなんだけど。
こうなってくると完全にキチガイステマだな。
誰も使わないゴミを作ってしまって焦ってるんだろう
こういうマイナーなプラグインは後で困るから使わない方がいいな。
スルーしときゃそのうち消えるでしょ
はい、スルーしてください。つまりただの普通の会話に
いちいち反応しないでください。
lodash最高なのに
使ってから言えよ、まじで
スレタイ読めないで普通の会話をしだすキチガイが使うプラグインということか
お前自分の意見と合わない人を批判したいだけの一番組織では使えないタイプの人間だろ?
lodashに関する質問はアピールや宣伝などではなく、単純に使っているからです
今まではあくまでユーティリティに使っていましたが、
関数言語的プログラミングがかなり保守性を上げることを実感してきたので、
コアな部分に組み込んで行こうと思っているところです
ろーだっしゅってあいいーろくでもつかえますか?
lodashのおかげで関数言語的プログラミングが強力なパラダイム変換だと開眼しました
それを知っている人が作ったライブラリだからでしょう
これからjqueryなみに重要なライブラリになるのは間違いありません
次第にjs本体に組み込まれていくでしょう
>>60 まじですか
文字系の関数はなんでないのと思っていたので、うれしいです
>>69-70 ここは質問スレです。雑談は自重してください。
ここまでLo-Dashの質問が増えたのならそろそろライブラリスレに移行すべきではないでしょうか。
ここはライブラリ系質問NGではありませんでしたが、Lo-Dashの質問で他の質問が埋もれるならすみわけする意味は十分にあります。
啓蒙の意味もありますので、しばらくここで続けたいと思っています
>>71 言うのは勝手、守るのも勝手、
守らないのも勝手、無視するのも勝手
ゴネ方が前と同じだな
ここまで酷いとマッチポンプを疑ってしまう
逆に胡散臭い印象を植付けようとしているのかも知れん
必ず批判的なレスが伴なうからググったときに効果的にサジェスト汚染される
何かアホが湧いているようですね
ライブラリにとってサジェスト汚染など何の意味もありません
そしてjqueryが普通になったようにlodashも普通になるのだから
lodashの質問はごく普通の質問なのです
>>75 だからスルーしてろって。
こっちは楽しくlodashの話してるから
お前はスルーするんだろう?
それともレスして盛り上げてくれるのかい?w
ならlodashもjqueryと同じように 別スレ立ててそっちへ誘導するようにしよう
サイコパスに構うな
lodashは構って貰うための1話題に過ぎん
総合的な話題はプログラム技術板に誘導すべき
iframe内をスクロールさせる方法というのはないでしょうか?
現在a.htmlというページをiframeでb.htmlから見ています。
a.htmlにはページ下部にトップへ戻るというリンクをjqueryで作成して貼ってありページ内スクロールするようにしていますが
b.htmlからトップへ戻るを選択してもスクロールしません。もちろんa.html内ではちゃんとスクロールするので構文などは間違っていないと思います。
iframe内のトップへ戻るを有効にするにはどうしたらいいのでしょうか?
コードみなきゃ分からないだろカスが
>>80 勝手にやれ。俺はここでやる。
>>82 iframe関連はセキュリティの制限があるから
ローカルに置いたら動かなかった気がする。
同じドメインのサーバーにおいて試してみては?
オブジェクトを入れた配列を使って、
2分ヒープ(BinaryHeap)を作った
オブジェクトのプロパティの値が、
最小のものを取り出す
優先度つきキュー (順位キュー、priority queue)や、
ダイクストラ法 (Dijkstra's Algorithm)で使えます
MIT License です。jsdo.itに発表しました
ttp://jsdo.it/michihito/bGH5
>>83 大変申し訳ありません
a.html
<script>
$(function(){
$("#pagetop").click(function(){
$("html,body").animate({scrollTop:0},'slow');
return false;
});
});
</script>
コンテンツ多数
<div id="pagetop">
<a href="#">このページのトップへ</a>
</div>
b.html
<iframe src="a.html" sandbox="allow-same-origin allow-forms allow-scripts" seamless></iframe>
となります。
>>86 「b.htmlからトップへ戻るを選択」とは
div#pagetop の click を意味するのか?
その div は a.html 側に属するように見えるのだが
lodashであるオブジェクトを他のオブジェクトにシャローに追加するにはどうしたらいいのでしょうか?
mixinだと思ったのですが
var a = {
0: 'a'
};
var b = {
1: 'b'
};
_.mixin(a,b);
console.log(a);
とやっても追加されていないようです
>>89 extendじゃなかったっけ?
defaultsってのもあるけど
mergeでもいいのか? 細かい違いで似たようなのがたくさんあるんだよなぁ。
>>91 _.extendあらため_.assignで出来ました!
ありがとうございました
似たようなのがたくさんあるってゴミライブラリみたいだな
ゴミだから使うなって事を広めに来たのか
啓蒙の為に書き込むのは止めて欲しいな
まあ、啓蒙にすらなってないけど、本人は啓蒙のつもりだろうし
>>96 使う価値無いってわかったんだから、このスレでもう話すことないよね
歪んだ正義感ほど厄介な物はない。
関数型プログラミングはオブジェクト指向の発明に匹敵するパラダイム変換だよね
>>98 自治厨の根底にあるのは正義感ではなくて恐怖だと思うよ
自分が新しい潮流に置いていかれることが怖いから自分の知らない話題に反発してるだけ
メソッドチェーンを途中で終わらせるにはどうしたらいいでしょうか?
jqueryにifメソッドを実装し、結果がfalseならそれ以降のメソッドチェーンを実行しない、
ということをやりたいのです
>>101 そういうプラグインがあったりするけどチェーンをやめた方が健康的だと思う。
ありがとうございます
プラグインあるんですか
phpのフレームワークでは例外を投げてメソッドチェーンから抜けているようだったので、
jsで外側にcatchブロックを配置するのは難しいかなと思っていたのですが
どうやってるのか気になります
一応言っておくがjQueryを拡張する話と、そういうプラグインがあるのとは全く別な話
jQueryが普通の作りならifを増設するくらい他愛無いが、やはりナンセンスだろう
もしも例外を投げて安全に抜けられるのならそちらの方がいい
それか、そもそもチェーンを諦める&依存をPromiseに移行する
lodashは数値にも対応して欲しいな
_(100).increment().valueOf()
みたいなことが出来るように
JS自体が完全なオブジェクト指向言語になるのが一番だけどそれは先のことだろうから
lodashの話持ち出すのはいいけど、そんな欠陥ばっかじゃ利用者増えないだろ
啓蒙したいなら、もっとベネフィットに焦点当てろよ
可能性があるがゆえに要望も出てくるんだが?
可能性ないなら「こうなればいい」とすら思わない
単に使わないだけ
ここのスレの大半がloadashなんて使わないって言ってるのに、「こうなればよい」と思うことを垂れ流しているお前の態度が問題だって言ってるんだよ
問題提起をする前に、loadashを使いたいと思う人間を増やす努力をしろよ
このスレの大半ワロタw
お前だけだろ
というか俺は啓蒙とか思ってないから。
俺等が話してるのを見てその意味に気付く奴は気付く、それでいい。
数値対応も時間の問題だし。
アイデアを伝播した方が実現が早まるので書いているだけだ。
そういう目的ならプラグインスレでやれよ
頭わるいな
var arr = [],n;
for (n in arr) { console.log(n); }
Array.prototype.hoge = function () { return this; }
for (n in arr) { console.log(n); } // hoge
console.log(Array.prototype.push); // function push() { [native code] }
for inで"push"とか"slice"とか出てくるならなんとなく納得してしまうのですがそうはなりません
何か特別な仕様なのでしょうか
>>105 いちいちlodashに噛み付かなくていいよw
lodashって単語見るたびに
いちいちムカついて書き込まずにはいられないのか?
そんな人生で疲れない?
lodashをNGワードにすれば見なくて済むよ。
それをしないなら、自分でわざわざ見ているのと一緒。
>>108 > ここのスレの大半がloadashなんて使わないって言ってるのに、「
ここは匿名掲示板なんで、大半とわかることはありえません。
つまり「大半が使わないって言ってるんだ」って
あなたが思い込みたいだけ。
それが露呈されただけのレスの意味しかない。
>>114 何がスレ違いなのですか?
その根拠を示すべきだと思いますよ。
>>105 それは質問ではないのでスレ違い
そしてその手の要望は作者に直接宣言すべき
最近、作者に直接いうべき発言が多くて困る
>>114 > (9) ライブラリ関連の質問は禁止ではありませんが、ライブラリスレで聞くとより回答を得やすいかもしれません。
>>116 人にレスするなら、流れを理解するくらいまでさかのぼれよ。
俺等が話してるのを見てその意味に気付く奴は気付く、それでいい。ってかいてるだろ?
日本語分からないのか?
話についてこれない奴はROMってろよカスが。
>>117 > (9) ライブラリ関連の質問は禁止ではありませんが、ライブラリスレで聞くとより回答を得やすいかもしれません。
禁止ではないw
>>116 作者にこんなのの相手をさせるつもりかいな
やっぱ前揉めたときにきっちりスレ分けるべきだったんじゃないの
>>118 >109の事をいってるなら見当違いも甚だしい
125 :
116:2014/05/08(木) 00:38:40.79 ID:xkhwF8/N
>>122 作者が相手してくれるかまでは保証できない
言い方次第では返信してくれるかもしれないし、無視される事もあるだろうが、それは作者が判断すべき事だと思う
どちらにせよ「ライブラリに関する機能提案」をここでしても有益な事は何もない
作者に直接メールするか、作者が開設しているforum(なければブログ等の何らかのコミュニティ)で議論するのが筋だろう
forumに書き込めば同意する人はレスするだろうし、彼のいう啓蒙もまあ出来なくはない
>>109では「俺等が話してるのを見てその意味に気付く奴は気付く、それでいい。」と豪語しているが、ようするに
・英語を書けないのでここで話題にすれば誰かが作者に提案してくれるだろう
・俺が提案しなくても誰かが提案してるはず。お前もそう思うだろう?
と他人に甘えた希望的観測を持っているに過ぎない
「皆がその考えを持っているなら作者に提案する人が誰もいない」という事実にこの人は気づいていない
なぜ作者に直接言わないのかしらないが、「障害があるなら自分で乗り越えてくれ」と彼に言いたい
俺だって英語苦手だが、頑張って読むし、皆そうしてると思うんだが
>>125 何度も言いますが、私の場合、目的は啓蒙ですから。
lodashを知らない人がその存在だけでも知ってくれさえすれば、それで十分なのです。
>>99 最古のスクリプト言語のLispは関数型だ
むしろ関数型→オブジェクト思考と言える
最近関数型言語の実装が進歩して見直されてはいるが
小技の質問です
var hoge =[];
の配列があったとして
このhogeの中身全部をfuge(hoge[i])の返り値にするとき
for(var i=0; i<hoge.length; i++){
hoge[i] =fuge(hoge[i]);
}
ってやってるんですが、これをもっと短く、早く、簡単に出来る方法とかありますか?
十分短いし簡単だと思うよ
死ぬほど早さを求めたいならfugeにhoge渡して配列が変えるようにすれば関数呼び出しが減る
.map() でいいんじゃね
>>111 arr.propertyIsEnumerable('hoge')
Array.propertyIsEnumerable('push')
>>128 最速なら、hoge.length は変化しないのなら、
変数に代入してから使った方がよいらしい
そうしないと毎回、プロパティ or 関数?が呼ばれる?
>>134 この手の流れだと結局のところ反論するにも使ってみなくてはならなくなるんだよ
否定的な意見が強く出れば出るほど、認知度アップが見込める
スレ違いだと思う人がいても、結果が出ている限りやめないよ
>>136 効果の有効性は問題ではない
質問スレで啓蒙することがスレ違い
自分の目的の為なら他人の迷惑を顧みないところを見るに相当甘やかされて育ってきたんだな
>>128 そういう時にこそlodashなんだよ
lodashに慣れるとダッサいコードが我慢できなくなるよ
あぁ「速く」か
関数型だと速くはならないな
全体が筋のいいコードになることでアルゴリズムがブラッシュアップされていくので
小技で汲々とするより、大きなところで速度改善がなされるけどね
関数型プログラミングは、処理の流れが一本で
一目で何をしているのか分かる。
そして一時変数が激減する。印象としては、なめらかな感じ。
従来のプログラミングは、
「これがこうなって、これがこうなって、そしてこれがこうなって・・」みたいな感じで
ガタガタしてる。
何をしているのか読み取るのに時間がかかる。
jqueryのメソッドチェーンと関数型プログラミングは
本質的には同じ思想から発している
>>126 はい、みんなにクソだから使うなと伝えておきますね
143 :
Name_Not_Found:2014/05/08(木) 10:04:57.10 ID:Wa+IFk0G
>>132 だから感覚だけで最速に近づいたとか言ってはいけない
兎に角、計測第一だ
プログラミングすると精神を病んでしまいますか?
嫌いなら病む
好きなら病まない
分業化が明確でない俺の会社を見る限り、好き嫌いではなく自分はプログラミングしかできないってしがみついてる奴は確実に病んでる
このスレにはウサインボルト一派がいる
そいつらは病的なほど速度とコードの短縮を求めてる
コード短縮と速度は両立しないけどな。
ネストされたオブジェクトの情報からdomエレメントを作ろうと思います
そういうプラグインみたいのありませんか?
オブジェクトにはclassやidやchildrenのようなキーがある感じです
>>148 操作の体感が重要なので、キュンキュンにするためなら何でもするつもりだった
一つでも命令が減らせるならそうした
しかしそんなことよりDOMツリーをなるべく単純に保つ方がずっとキュンキュンになることが分かり
俺は変わった
ループのたびに関数を呼び出すなんてとんでもないと思っていた時代が俺にもありました
153 :
Name_Not_Found:2014/05/08(木) 21:17:05.55 ID:Rjk5lK0S
本来とは質問の種類が違うかもしれませんが、初心者用スレにJavaScriptの質問は
こちらのスレでとあったのでこちらで質問させていただきます。
環境 Win7 64bit Firefox28
Firefoxでサイト閲覧時にJavaScriptは有効となっているはずなのに(別サイトおよびabout:configでも確認済み)
JavaScriptを用いて表示されるはずの画像が何故か見られません。
関係あるかどうか分かりませんがこの直前にFirefoxのアドオンでJAVAの有効・無効の切り替えをしていました。(ただ現在有効でも無効でもJavaScriptを用いた画像は見られません)
この画像が見られない原因(考えうる可能性でも)および直し方を教えてください。
ちなみに同じサイトをIE11で確認したらその画像を見ることができたのでセキュリティソフト関係ではないと思われます。
firefox portableを落として
アドオンなど入ってない素のままのfirefoxで閲覧してみたら
オブジェクトのキーの順番は保証されないのですか?
オブジェクトのキーの順番とはどのような順番ですか?
は?書いた順番ですが?
書いた順番にループでも取り出されのかって意味です
>>158 取り出す時に使用する構文は何ですか?
コードを書いて下さい
for in
です
>>160 for-inは列挙順を保証しません
順序に規則性があるなら配列を使用して下さい
そうですか・・・
分かりました
ちなみにオブジェクトに登録したキー順に取り出さないといけないケースってどんなときですか
考えたのはfor in ついでにdocumentにappendするときですかね?
それならあの方法が使えますが
[1,2]と[3,4,5,6]という二つの配列を使って
[[1,3],[1,4],[1,5],[1,6],[2,3],[2,4],[2,5],[2,6]]
という一つの配列を作りたいです。
これをlodashでやるにはどうしたらいいでしょうか?
データベースで言うクロスジョインになると思うのですが
そういう関数は標準ではないようで・・
そんな複雑なことlodashにはできません
ゴミだな
>>164 何をfor-inして何をappendするのですか
appendとはappendChildですか
あの方法とは何ですか
>>156-157もそうですが、内容を省略する癖があるようなので気をつけたほうがいいと思います
ぶっちゃけ、ここまで書いて理解できないようなら、教えるだけ無駄
本人は省略したのは周知の事実だからと認識しているのだろうが、本人が想定していない可能性がある事は考えてもいないんだろうな
「〜に決まってます」と返す人はプログラミングに向いてない
>>153 たぶん、そのサイトを作っているやつは素人なんだろう
IE11にだけ対応している、
HTML5, CSS3タグを使っているんだろう
JavaScriptとは関係ないかも
それか、Firefoxにもデバッガが付いているだろ?
それであちこちに、ブレークポイントを付けて、
動かしたり止めたりしながら、動きを確かめたら?
173 :
172:2014/05/09(金) 13:18:36.46 ID:???
たぶん作者が、そのサイトを作るときに、
IE11ではテストしたが、Firefoxではテストしなかったのだろう
Firefoxには、HTML5, CSS3, JavaScriptの、
未対応タグや構文間違いをチェックする、ツールは付いていないか?
または、そういうプラグインは無いか?
>>165の件ですが、rubyにproductというメソッドがあり、
jsで該当するコードも検索で見つけられました
このメソッドもそのうちlodashに実装されそうです
producthベクトル積だろ
いや「積」だから
配列だろうがベクトルだろうがproductなんだよ
本屋いったらsublime textの本があったわ
lodashの本が出るのも時間の問題だな
>>177 使いこなし方!みたいな?
本の名前教えて
Web制作者のためのSublime Textの教科書
という本
Sublime Text www 完全にチョンでワロタwww lodash 推しはチョンだったのかwww すげー納得できたわwww
何言ってんだこいつはw
頭おかしいな
というか、やっぱりD級プログラマーはネトウヨだったか
チョン、ネトウヨ、D級プログラマといっている人は皆おかしい
NO
>>184 ありがとうございます
自分が見つけたのもまさにそのサイトでした
lodashは発祥がunderscoreクローンなので、まだunderscoreの記事の方が多いようですね
そろそろunderscoreを乗り越えて独自実装に力を入れていってほしいです
productはperlとかで実装したことあるけど、
時々使うんだよね。lodashに入ってなかったとは。
>>186 いや、トップにデカデカとかいてあるやんw
http://lodash.com/ Features not in Underscore
Underscoreではなくlodashを使う理由は
速度が速いからではなく、関数が多いからだと
思っていたけど。
完全互換ではないけど、まだそこまで独自実装に積極的でないような?
その程度の意味
>>184 それはlodashである必要性が皆無だね
標準で十分実装できる
forループの方が速いしコードも短い。使い所が理解できてない人が無闇に宣伝しても、ネガティブキャンペーンにしか見えない
>>153 まずコンソールを確認する
何も表示されてなかったらデバッガを開いてもう一度実行する
エラーがあれば止まるが止まらなかったら適当なところにブレーク張ってステップ実行していくしかないな
以前firefoxのコンソールで__proto__が使えたと思うのですが
chrome(じゃなくてもいいですが)で同じようなプロパティ
もしくは参照できるようなものはありませんでしょうか
よろしくおねがいします
最初の文字だけ大文字にする一番簡単な方法はなんですか?
>>191 じゃあこの回答者が質問者の使ってないunderscore.jsを使ってコードを書いて、
16件の評価をもらっているのはなんでなんですかねぇ?
しょうもないケチを付ける前に自分のスキルを振り返った方がいいですよ
能力のある人間は、未知の現象に当たった時、
「自分は分からないが何か理由があるのだろう」と考える
無能な人間は短絡的かつ可能性の低い理由に飛びつき、
「相手が愚かだからだろう」と考える
したがって未知の出来事への反応を見れば、
人間の能力というものはおおかた正確に見極められる
>>190や
>>191がどっちなのかは、もちろん言うまでもないですね
lodashはS級アプリのtweetdeckにも使われるんだが。
謎の否定をしてる珍プログラマーはtweetdeckレベルのモン作れるようになってから偉そうなこと言えよ
lodashをダシに、自身の正当性や論理を展開する浅ましさ
lodashをタテに、スレ違いの荒らし行為を正当化させていると言うべきか
珍グラマー何言ってるか分からんわ
もう黙っとけよ、それが一番いいから。
誰にとってもな
ライブラリの話は禁止されてないからスレ違いですら無いしなぁ。
なんでlodashがこのスレででてくるか。
たとえばjQueryはDOMライブラリだからDOMの話に登場するのは当たり前。
lodashはなんのライブラリかというと標準関数のライブラリなんだよね。
JavaScriptの基本文法を拡張するライブラリのようなもの
たとえば、forEachメソッドに相当する_.eachがあったりする。
なのでこのスレででてくるのは当然なんだよね。
つまりlodashはゴミみたいなもんってこしか
lodashそのものはゴミではない
スレ違いを指すものは、質問者に成りすまして啓蒙活動をすることだ
何を自分の都合の良いように解釈しているのか
>>202 俺は見抜いてるんだー。質問者になりすまして啓蒙活動してるって
見抜いてるんだ。匿名掲示板だけど、全部わかってるんだー。
って言いたいわけ?
俺の解釈は、啓蒙活動だ。
お前は、都合のいい解釈をするな。
>>196 未知の現象に当たったのは君だよ
君は
>>184のほとんどのメソッドが標準で実装されている事実を知らないでしょ
だからそんな頓珍漢なレスになるんだよ
>>203 少なくとも私はそう思っている。
最終的にはこのスレの質問者と回答者に判断を委ねるが、あなたはその2者のどちらでもない。
あなたは、匿名を盾に相手の虚を付くことではなく、質問者に成りすまし啓蒙活動をしていないことを証明すべきだ。
匿名という名の盾を外し、個として発言して下さい。
lodashが下位互換もので使えないと言われれば、相手の能力を蔑み、
lodashが必要とされていないと言われれば、匿名掲示板を盾にマイノリティー派として見下す。
一体あなたの発言の何を信じればいいのか。
匿名掲示板で啓蒙活動?寝ぼけるのもいい加減にしろ。
ライブラリの質問はスレ違いではないですが、Lo-Dashの質問が増えたので住み分けの為にライブラリスレに移行を促したら、
>>72で啓蒙を理由に拒否されました。
これには今でも納得できません。
仕方ないから次から厳格にライブラリはスレチにすればいいよ
このスレはもう諦めとけ
>>72,126は啓蒙を理由にLo-Dashの雑談をしてる
雑談は明らかにスレ違い
俺もライブラリはライブラリスレでいいと思う
>>1の(9)を書き換えていいんじゃないかな
テンプレ修正するなら雑談禁止ルールも欲しいな
あんまいいたくなかったが、ここまで雑談が増えると目に余る
現時点で雑談禁止までしなくていいよ
自己主張のために人を不快にするほど過度なライブラリの話をしたのが問題なんだから
件のやつを除けば質問を肴にした雑談が殆どだしいいんでね
それで回答者の数を確保してる側面もあると思う
>>194 最初の1文字だけ取り出してあっぱーしたらいんじゃね?
ここまで自作自演w
ろーだっちゅを啓蒙するには、専用スレ建てて有用な議論交わし続けることだよね
ここでゴミのようなソースや欠点さらしつづけても、便利だとも思わないし選択肢から消えるだけ
まあ、それが目的なのかもしれないが
はい、それが目的なので
ここでずっとやりますよw
やらない理由がない。
見たくない人は、lodashをNGワードに指定すればいいだけ。
皆さんは __proto__ を何て読んでいますか?
単に「プロト」ですか?
「アンスコアンスコプロトアンスコアンスコ」ですか?
>>218 > やらない理由がない。
lodash信者に加えて、lodash否定派まで参加したら争いが絶えない
>>221 だから、それが嫌ならこのスレから出ていくか、
lodashをNGワードに指定すればいいって言ってるんだよ。
>>222 自分から迷惑行為をしておいて「出てけ」というか
自己中を極めてるな
>>223 えとさ、でていかなくていいんだよ。
でもこの状況は変わらない。
どうせ書き込み相手を2ちゃんねるから遮断することも出来ないんだし、
ネットをやめさせることも出来ない。どうやってもとめることは不可能。
だよね? 違う?
文句の書き込みでスレ埋めるってことが君がしたいことなの?
>>224 > でもこの状況は変わらない。
いや、lodash否定派が進んで争いの種を撒いてるんでしょ
自分から争いの種を撒いておいて何他人行儀な話しぶりなのさ
最初から否定派に回らず、スルーすればいいでしょ
「だから、それが嫌なら」という書き方から
>>218と同一人物と判断したけど、違うのならわかる書き方をしてくれよ
「だから」なんて紛らわしすぎる
>>225 じゃあ俺はもうお前を無視するよ。
ただし無視するのはお前とこのくだらない話題だけで、
lodashに関連する話題が出たらレスはする。
その時、お前は何をする?
それだけ聞かせてくれ。
>>226 もう君が何を言ってるのかさっぱりわからない
・結局、あなたが
>>218だったのかどうかが不明
・「lodashをNGワードに指定すればいい」といったと思えば、「lodashに関連する話題が出たらレスはする」と先の発言を否定する事をいってる
自己矛盾に気がついてないのか
> その時、お前は何をする?
こちらの質問は無視して自分だけ質問するのか
その発言に矛盾があってひょっとしたら理解してくれるかもと思ったら指摘するが、それ以外はスルーする
匿名掲示板では先の自分の発言を自分ではないことにすることが出来る
いくらでも他人になりすませるので矛盾があっても「それは自分ではない」と言い訳できる
会話が成り立たなくて当然だな
>>227 「lodashをNGワードに指定すればいい」
というのは見たくない人に対してで
「lodashに関連する話題が出たらレスはする」
は、勝手にするってことだろ?
>>227 もしかしてNGワードの意味がわからなかったのか?
2ちゃんねるブラウザでNGワードに登録すると
その書き込みは見えなくなるんだよ。
見たくないものは見なくて済むよって言うこと。
>>203 この挑発的な煽り方と一緒だな。じゃあハッキリ言ってやろうじゃないか。
>>229-230 誰にも賛同されず、スレルールすら無視して話そうとする、
お前の存在がこのスレには要らない。
お前が居なくなれば、通常通りスレは進行し、皆楽しく有意義に雑談・技術やアドバイスを話し合える。
お前が居なくなれば、スレのテンプレも変える必要もなく、NGワードも使う必要がなくなる。
お前が居なくなれば、ライブラリの話も異常に警戒することもなくなる。
それでも居続けるお前は荒らし、荒らし以外の何者でもない。
うるさーい(´・ω・`)
ECMAScript5で追加されたArrayのフィルター系メソッド(every,some,forEach,map,filter,reduce,reduceRight)
を使えば大抵事足りる(IE9以降が必要だが)
>>233 IE9移行が必要でしょ?
そういう時にlodash使えばいいわけよ。
古いブラウザ(XPサポートおわっちゃったが、そのIE6までも)対応している。
これからもJavaScriptは拡張されるし、ブラウザごとの差異はなくならないので
クロスブラウザを考えると、こういうライブラリが無くなることはないだろう。
ユーティリティライブラリ vs Polyfillライブラリみたいな?
Polyfillっていうのは、標準が決まらないと作れないんだよね。
あくまで標準を満たしていないものに、対応機能を追加するものだから。
それはそれであるといいんだけど、進化はどうしても遅くなっちゃうの。
ECMAScript 5 はもう十分に安定してるから問題ない
Polyfillライブラリを使えば問題ないってことだろう
少なくとも
>>184はそう
>>205 知らないわけないだろww
低能は他人を自分以下に設定したがるから面倒くさい
lodashを使うという発想はES3基準にするところから始まってるんだよ
ES3でもES5やES6の機能を使えるって凄いな。
範囲が広くて利用者が多いPolyfillライブラリが無いってことだよね
Polyfillは所詮Polyfillで、標準機能よりも
多くのことは出来ないからなぁ。
lodashはpolyfill以上のものだから。
jqueryもそうだけど良く出来たライブラリはJSの機能を予言的に実現していく。
ライブラリについて話すということは未来のJSについて話すことと同じ。
標準機能という過去にしがみつくか、ライブラリという未来に手を伸ばすか
そこがB級以下とA級以上の差だろうな
jQueryやlodashも標準仕様全ての上位互換じゃないから、一長一短だよね
独自の仕様を基礎にするか、標準や草案の仕様を基礎にするか
今時、IE8をサポートしなきゃいけない状況はそう多くないな
IE6は尚更だ
IE8の駆逐作業はXPサポート切れ1年前あたりから急激に行われてきた気がする
そもそも、lodashに限らず、特定のライブラリに依存したくないや
>>246 そもそもJavaScriptは標準ライブラリが貧弱だからな。
あとpolyfillのような標準に準拠させるためのライブラリっていうのは
異端な存在で、普通のライブラリは、標準仕様では提供されていない
機能を提供するものだ。
>>246 > jQueryやlodashも標準仕様全ての上位互換じゃないから
他の言語を使っている人からすれば意味不明だなこれ。
たとえばここにRubyのライブラリがたくさんあるわけだが
https://rubygems.org/ それらは標準仕様すべての上位互換か?
ライブラリに何を求めているのだろうか?
古いブラウザ用に標準仕様を満たすためのもの?
そんなわけがない。標準仕様を実装するのはライブラリの仕事ではない。
長らくJavaScriptの世界にライブラリと呼べるものがなかったからだろうか
ライブラリを互換性を保つためのものだと勘違いしている人がいる。
>>250 jQueryやlodashも、polyfillするコード群も、標準仕様の機能を含むからライブラリと呼ぶべきではないってこと?
>>253 含むだけなら、「Polyfill + ライブラリ」だろ
屁理屈言ってるんじゃねーよw
重要なのは関数言語的パラダイム変換とライブラリが連動しているということ
標準機能だけで「悟り」を得るのは不可能
rubyでもpythonでも、もちろんJSでも不可能だった悟りを俺はlodashで得た
jQueryやlodashに含まれてるのは
ブラウザ間での非互換性を解決する機能であって
標準仕様そのものじゃないけどな。
たしかprototype.jsには標準機能を満たすための
実装が含まれていたけど、早期実装してしまったために
あとから標準になった仕様と同じ名前のメソッドで
動きが違うという別の問題を起こしてしまったけど。
何この終わりのない宗教戦争
>>246が全てを語ってると思うけどな
それ以上はただの個人的な感情のぶつかり合いだ
意味不明w
すべてを語っているどころか情報量ゼロじゃねーか
jQueryやlodashも標準仕様も一長一短
どっちがいいかケースバイケース
lodashで悟りを得るとか言ってるのはただの信者でしょ
一長一短ww
「右の反対は左」みたいなことを言って悦に入れる頭の悪さが羨ましいわ
>>259 それはまともな反論だな
たしかに単純に速度だけで言うと、当然ながら遅くなる
コストの高い関数呼び出ししまくりだし。
でもボトルネック以外のところは10倍遅くても体感は変わらないし、
その遅さを余裕で帳消しにするメリットがあるわけだ
>>263 たとえば、JavaScriptのforEach。
なんでforがあるのに作られたと思う?
それは、作るのが早く、バグが少なくなるから。
lodashは基本的にこのような考え方で作られている。
もっといい方法があるということは、JavaScript自身で
証明されているんだよ。
lodashはそれを先行実装しているだけ。
ECMAScript 10ぐらいになったら、lodashの
今のメソッドを全部実装するかもね。
なるほど、未来のJavaScriptを今すぐに
使えるようになるってわけだな。
未来のJavaScriptをすぐに使えるっていうのは
わかりやすいメリットだな。
forEachもそうだけど、JavaScriptを見ていると
クロージャーを引数に取る関数ってのが増えてきている。
アロー演算子というクロージャーを引数にとる関数を
使いやすくする機能も出来た。
この流れは主流になるんじゃないかな。というか、もう主流かな。
lodashを使えばこれが今すぐ現実になる。
>>264 「作るのが早く、バグが少なくなるから」の具体例は?
forに対してforEachのメリットは何となくわかるけど、あなたの説明には具体性がなく説得力にかける
それにforEachはES5であってlodashではないからlodashのメリットが全く伝わってこない
lodashが先行仕様になってる理由も説明できてないように読めるけど、もっと具体的に話して欲しい
なんでかまうのか
アロー演算子とあるか、ライブラリで演算子を拡張できるものなのか
オブジェクト指向以後は、オブジェクト指向より前には戻れない
しかし、オブジェクト指向のメリットを言葉で説明するのはなかなか難しい
関数型言語のメリットもこれに似ている
「これは良いものだ」と分かるが、良さを説明するのは難しい
しかし一言で言うと、コードが美しくなる
>>267 まずさ、前提として
lodashにforEach相当のものがあるって知ってる?
あと、lodashのAPI一覧。forEachのお仲間だよ。
http://lodash.com/docs Arraysだけでこれだけある。Collections、Functions、Objects、Utilities、その他を入れるとこの4倍
_.compact
_.difference
_.findIndex
_.findLastIndex
_.first
_.flatten
_.indexOf
_.initial
_.intersection
_.last
_.lastIndexOf
_.pull
_.range
_.remove
_.rest
_.sortedIndex
_.union
_.uniq
_.without
_.xor
_.zip
_.zipObject
熱い議論の途中ですまんが
今から使うならunderscoreよりもlodashを使うべきなの?
>>272 「lodashに多数の関数が定義されてる」だけではメリットとはいえないと思う
それならjQueryの方がよほどたくさんの関数やpluginがあるよ
多数の機能が揃っているだけならplugin数の多いjQueryに軍配があがる
というか、「たくさんの機能があるからいい」は短絡に過ぎると思うけど、如何?
lodashにあるforEachはES5相当の機能だから、lodashを使う必然性がない
lodashのメリットにはなりえないよ
underscoreって単独でも使えるけど、
backboneのおまけみたいで気持ち悪いんだよね。
lodashの方が関数多いはずだし、
lodashよりメリットあるの?
>>273 用途に合ったライブラリを選べばいいだけで、無条件にどちらを選ぶってものでもないと思うよ
両方使ってみて自分の感性に合うライブラリを使用するのが一番いい
>>274 便利な関数が沢山定義されているのは
明らかなメリットでしょ?
lodashとECMAScriptを見てると、
JavaScript標準ライブラリの進化した先がlodashに見えてくるよ。
forEachもそうだし、将来lodashの幾つかが
JavaScriptにバックポートされてもおかしくないよね。
>>278 便利な関数ならね
でも、便利な関数が多数あることを説明できてないでしょ?
>>281 lodashの関数が便利なのは当たり前で知らない人は低レベルなのか
何か話が合わないようなのでこの辺で失礼するよ
気を悪くしたらごめんね
>>276-277 レスさんくす
undersocreっておまけのような存在だったのか
知らなんだ
最近ここを覗くようになって頻繁にlodashが出てくるから
underscoreと比べどんなメリットがあるのかと思ったんだ
underscoreとlodashとの差分がポイントの1つなんだね。
ともあれ
>>277 の言うように実際に自分で使ってみて判断するのが一番なんだろうな
Array.prototype.forEach の起源は Lo-Dash なのでしょうか?
私は Firefox が起源だと思っていたのですが…。
いえいえ消えてくれるのは
本望なのでどんどん去ってください。
>>284 forEach、つまりクロージャーを引数に取る
ループは関数型言語起源だよ。
lodashどころかECMAScritpでもFirefoxでもない
そして、関数型言語起源のものを
JavaScriptで使えるようにしたのが
lodashなんだ。
ECMAScriptではそのほんの一部しか採用されていないが、
lodashであれば更に多くの関数型言語起源のものが使える。
forEachがそうだがJavaScriptは関数型言語起源のものを採用しつつある。
だからlodashを使うということは、将来のJavaScriptを使っているようなものなんだよ。
>>283 確かに Lo-Dash の話題が多いようだけど、一部の狂信的な信者も常駐している感があるのでお気をつけを
全部が信者とはいわないけど、Lo-Dash 関係の話題は自分で検証して事実確認するぐらいには疑っても損はないと思うよ
結局、自分で使うものだからね
他人に判断を委ねるぐらいなら、自分で検証して判断するのが一番いい
lodashの関数の有用性は今更考えることじゃないな。
他の言語の焼き直しなんだし。
var hoge;の中の数値があるか?ってとき
if(!hoge && hoge!=0)
ってやってるんですがもっと一発でフィニッシュできる方法ありまっか?
話題が多いっていうかこの板じゃID出ないからね
291 :
284:2014/05/10(土) 23:46:10.65 ID:???
>>286 せっかく回答いただいたのに申し訳ないのですが、私の質問内容に沿う回答ではないようです。
foreach が PHP 等の他言語に存在することは知っていますが、「それをJavaScriptに始めに取り込んだ実装が何であるのか」を質問しています。
>>279で Lo-Dash が forEach の先行実装かのように説明されていたので気になっていましたが、そういうわけでもないんですね。
>>289 それ、実は難しい問題だよ。
何を数値とみなすのか。
たとえば、16進数表記は数値としてみなすのか?
指数表記は数値としてみなすのか?
無限大(Infinity)は数値としてみなすのか。
そこを答えてくれないかな?
>>289 「数値があるか」の定義が不明だけど、typeof hoge === 'number' でいいんじゃない?
しらんけどforEachはFirefoxが先行だとしても
それ以外はlodashが先行しているのが多いよ。
あ、underscoreが先行かもしれないね。
相変わらず、lodash信者は適当な事ばかりいう
そういやあのバカは
ちゃんとNGワードにしたんだろうか?
あ、このレス見えないようにlodashって入れておこうwww
297 :
284:2014/05/10(土) 23:55:07.19 ID:???
>>294 そうですか、わかりました。
参考までにお聞きしますが、lodashが先行している機能は何でしょうか?
299 :
284:2014/05/10(土) 23:59:54.13 ID:???
>>298 "Features not in Underscore" は先行仕様の説明ではありませんが…。
underscoreのコンセプトを深化させたのがlodash
今からわざわざunderscoreをする必要はないんじゃないかな?
>>299 Underscoreよりも先ってことは
先行って考えてあってるよ。
そこに書いてある機能は
JavaScritにない機能だから
302 :
284:2014/05/11(日) 00:12:37.28 ID:???
>>301 どうも私の意図が期待通りに伝わっていないように見受けられます。
私が意図するのは Lo-Dash が ECMAScript の先行仕様となった機能です。
つまり、ECMAScript が定義される前に Lo-Dash がその関数を定義したことを証明しなければなりません。
例えば、ES5 の Array.prototype.forEash は Lo-Dash にもありますが、ES5 が定義されてから Lo-Dash で実装されたのならそれは Lo-Dash が先行したとはいいません。
ES5 ないし ES6 と同じ関数が Lo-Dash にあるだけでは Lo-Dash が先行したことにはならないのです。
お分かり頂けますでしょうか。
> そこに書いてある機能はJavaScritにない機能だから
JavaScript という仕様はありませんが、何を指すのでしょうか。
疑問に託けて荒らし弄って遊ぶのも良くないと思うの
setTimeout( function(){
〜処理〜
}.apply(this), 10);
//}.call(this), 10);
//}.bind(this), 10);
settimeoutの中ではthisにグローバルがセットされてしまうから
対策として、apply、call、bindのどれかを使おうと考えているのですが、
どれを使えばいいでしょうか?
この3つのメソッドって違いがよくわかりません。
>>304 感覚的にはbindだが、背景が不明な状況で確かな事はいえない
3つの違いを理解できるまで使いこなしてから決めるのが最善だと思う
call=thisを指定して関数呼び出し出来る。引数を列挙させなくてはいけない。ES3でも可
apply=thisを指定して関数呼び出し出来る。引数を配列で渡せる。ES3でも可
bind=thisを指定する別の関数を生成。ES5以降
bindはコールバック関数を作る時に使う。ES3対応させたいならlodashを使えばいい。
これはひどい。もうlodashをNGに入れざるをえないな。。。
勝手にそうしとけよw
アンチlodashの原始人どもは邪魔なだけだから
document.getElementByIdを
jqueryでするのはどうやればいいですか?
ありがとうございました
あるid要素の有無を知りたい時には
$('#'+id).length
を調べるのが普通ですか?
testというidの要素を示すセレクターは
#test
ですよね?
>>317 そうですね。それは「id要素」ではありませんが。
bindはIE9移行じゃないと使えない。
lodashなら使えるよ
素朴な疑問だけど、将来的にthisが呼び出し元に依存しないようになることってありえるのかな・・・?
アロー関数いいよね。
たとえばこんなコード(配列の各要素を3倍した配列を返す)が
_.map([1, 2, 3], function(num) { return num * 3; });
たったのこれだけになる。
_.map([1, 2, 3], num => num * 3);
324 :
304:2014/05/11(日) 09:28:44.12 ID:???
みなさまありがとうございます。
bindを使ってみます。
bindは、goodpatrsに定義の仕方が載っていたので、
使えないブラウザ向けに使おうと考えてます。
lodashは今度調べます。
また、以前質問しました
var obokata={};
obokata.value="捏造";
obokata.stap=(function(){alert(this.value)});
obokata.stap();//捏造
obokata.stap2=(function(){alert(this.value)})();//undefined
メソッドを即時実行関数式にした場合は、callを使うのがベストなのでしょうか?
obokata.stap2=(function(){alert(this.value)}).call(obokata); //捏造
ゲーム制作などのサンプルコードをみていると
まるでパラパラ漫画のように一旦全ての要素を削除後、一から要素を構築というコードが多いのですが
要素を使いまわすことに何かデメリットでもあるのでしょうか?
>>325 そのサンプルコードが糞なだけじゃない?
デスクトップアプリ、一般のゲームアプリでは全部消してから
再描画するのは、ごく普通のやり方。
でもそれをDOMの世界に持ち込んでもだめだろう。
WebGLとかを使うなら、全部消して再描画でいいけどね。
たんにDOMを使ったゲーム作成に最適化されてないだけかと。
JavaScriptは最初から関数が第一級オブジェクトの先鋭的な関数型プログラムができる言語と言える
ライブラリ使わなきゃ無理な訳じゃない
>>328 いや、JavaScriptが関数型プログラムができる言語だから
関数型プログラミングに適したライブラリが出来たわけ。
このライブラリがなければ、自力実装しなきゃいけないよ?
ライブラリなんていらないだろ。
全部自分で作ればいいだけ。
というか、if(!hoge && hoge!=0)が成立するのって何?
面倒くさい書き方をするな。
if (hoge || hoge==0) でいいだろ
>>274 古いブラウザでも、動くんだろう
新しいブラウザなら、そのブラウザにあるforEachを使う
バグを減らして、開発コストを抑えるのが、目的
数値で、なおかつ0より上ってことだろ?
だから
>>334はおかしい
if (_.isNumber(val) && val > 0)
これでいいじゃん
0より上なら
if (val > 0)
でいいじゃん
何で変な判定入れるの?
var a = true;
console.log((a>0));
これでもtrueになるから
ライブドアブログで記事をランダムに表示させています。
トップページからその機能を使うと問題ありませんが、個別記事ページからランダムで表示しようとすると
別のリンクに飛んでしまいます。 このようなものをライブドアブログのブログパーツのうちフリーエリアに追加しています。
<script type="text/javascript">
var article = new Array();
article[0] = "表示させたいページのURL";
article[1] = "表示させたいページのURL";
article[2] = "表示させたいページのURL";
article[3] = "表示させたいページのURL";
article[4] = "表示させたいページのURL";
article[5] = "表示させたいページのURL";
n = Math.floor(Math.random()*article.length);
document.write("<a href='"+article[n]+"'>");
</script>
<img src="表示させたい画像のURL" alt="ランダム記事" border="0">
参考にしたのは以下のリンクからです。
http://blog.livedoor.jp/kimagure_ryu/archives/1545845.html トップページからサイドカラムにあるランダム表示ボタンを押すと、
設定してある記事のURLのうちランダムで記事を表示してくれます。
しかし、その後ランダムで表示された記事から、もう一度ランダム表示ボタンを押すと
設定していないURLに飛んでしまいます。
404 NOT FOUNDというページに飛んでしまいます。
ランダムで記事を表示するには一度トップページに戻ってから再度ボタンを押さなければランダムで表示することが出来ない状態を解消したいのですが、方法がわかりません。
設定してあるURLはすべて確認しましたので、間違いないはずです。
>>342 とりあえず、素人サイトを参考にするな。気持ち悪いコードだ。
まず、 new Array(); は使わない。そして配列への代入は一気にやれ。
必要ないのにインデックス番号を書くな。変数名は複数形にしろ。
更に推奨で、HTML5ならtype属性はもう要らない。
グローバル変数nを使うな。aタグが閉じられていない。
borderはスタイルシートで消せ
<style>
img { border: none }
</style>
<script>
var articles = [
"表示させたいページのURL",
"表示させたいページのURL",
"表示させたいページのURL",
"表示させたいページのURL",
"表示させたいページのURL",
"表示させたいページのURL",
];
var n = Math.floor(Math.random() * articles.length);
document.write("<a href='"+article[n]+"'><img src='表示させたい画像のURL' alt='ランダム記事'></a>");
</script>
おっと、このままじゃarticlesもnもグローバルだったなw
さてここからはjQueryとlodashを使おう。
<style>
img { border: none }
</style>
<script>
$(function() {
var articles = [
"表示させたいページのURL",
"表示させたいページのURL",
"表示させたいページのURL",
"表示させたいページのURL",
"表示させたいページのURL",
"表示させたいページのURL",
];
$('#random-url').attr('href', articles[_.random(articles.length)]);
});
</script>
<a id="random-url"><img src='表示させたい画像のURL' alt='ランダム記事'></a>
なんでaタグ内はダブルクォーテーションなのにimgタグ内はシングルクォーテーションなのですか
エスケープすんのがめんどくせーからだろ
下のAタグはbodyタグ内のやつじゃないの?
あとこんな短いコードに二つもライブラリ
必要?
なにそれマジレス?
>>350 id要素という固有名詞なんてないのですから、指定のidの要素と分かるのでは?
固有名詞があるかのように言いだしたのはあなたなのに人になすりつけないで下さい
>>350 いや、
>>315が言っている(思っている)id要素ってのは、
>>317でわかるんだけど、
あなたがわざわざ「」付きで書いているから、別のそういう用語があるのかと思って
で、了解した。回答ありがとう
lodashでユーザ独自のプラグインを作ることは出来ないのでしょうか?
>>340 _.randomって普通にMath.random使えよ
マジ糞だな
狂信的lodashアンチの方が糞だろ
常識で考えて
parseIntは基数を書かなくていいのでlodashのを使っていますが
標準の方がいいと思う人いますか?
標準がいいに決まってる
Note: This method avoids differences in native ES3 and ES5 parseInt implementations.
See
http://es5.github.io/#E. つまり互換性のためか
lodashを使っておいた方が間違いはないな
効いてる効いてる
アンチ謎の効果あり宣言w
アンチは計測不能なほど小さいパフォーマンス改善のために
潜在的に危険なコードな放置しておけばいいんじゃないですかぁ?
>>354 普通にlodashオブジェクトにメソッド追加すれば出来るよ
今日の対決ではlodashアンチの方が押され気味だねw
lodashに興味が湧いてきたよ
なあに、こっちは対決なんかしておらず
簡単に書ける方法を教えているだけよ。
それがたまたまlodashだったってだけで。
_.mixin({
push: function(array,item){
array.push(item);
return array;
}
});
これだけでpushが追加できました
しかもメソッドチェーンにも対応していて
_([]).push('a').push('b').valueOf()
みたいな書き方も出来ます
lodash最高\(^o^)/
ちなみに.push().push()するような場面はどのようなときにありますか
ただのサンプルだろう?
まさかテストコードに実用性を求められるとはw
今までpushやshiftしたい時はtapで関数を渡してたのでスッキリしました〜
>>344 シングルクオートとダブルクオートが逆。
lodashのメソッドは通常非破壊的なようです
var a = ['a','b','c'];
_(a).first(1);
console.log(a);//aには変化なし
_(a).push('d');
console.log(a);//aも変化している
破壊性と非破壊性に意識的になってないと思わぬトラブルになるかもしれません
>>375 ライブラリのくせに余計な気を使わせるとかゴミだな
いやpushなどは自分で追加したので、普通は気にする必要ないですよ?
pushすら無いのかよゴミだな
_.assignも破壊的なので、必ず非破壊的というわけではないですね
このあたりはまぁ普通のJSプログラミングでも意識する部分なので
lodashが最高なのは恒真ですが
今日調べて分かったことを日記帳に書いたような、ドキュメントの例文レベルの議題と解決例を書き連ねて、このままスレが終わるのもアリかもね。
次スレからライブラリの話は禁止で。
自分に分からないことを書かれたからって拗ねるのはやめて下さいね
迷惑なので
今の状況を見て今更疑問に思ったんだけど
このスレなんでID出るプログラム板じゃなくてWeb製作に立ってんの?
「オブジェクトの指定した属性に指定した値を加算する」が出来る
標準関数はlodashにないですよね?
{
x:100,
y:-100
}
などを渡すと、x+=100, y+=-100をする、というようなものです
そりゃ必要ないからだろ
lodashで破壊的メソッドを実行する時、元オブジェクトは変えたくないのでクローニングしようと思い
_(a).clone().hoge()
とすると、cloneはチェーンに対応していないようでエラーが出ました。
なのでクローンしてラッパーオブジェクトを返すプラグインを追加し、
cloneのかわりにそれを使ったら、想定通りに動作しました。
動いたのでいいのですが、標準機能では同じことは出来ないのでしょうか?
mapがあるだろ
ライブラリに走る奴は標準機能をよく理解してない傾向がある
lなんとかに触るときはアンカつけてくれ
一緒に消えるから
>>353 一応、XHTMLであれば「id要素」を定義することが可能です。
括弧付で書いたのは「あなたの質問したid要素とは異なりますよ」と明示する為。
確かに意地悪な回答でしたが、不明瞭な質問(使用ライブラリを明示しない、id要素というオレオレ用語を使う)には端的な回答を返すことにしています。
過去に不明瞭な質問に憶測で回答して痛い目にあったことがあり、自己防衛のためです。
- 憶測で回答して間違っていた(初回回答時に確認すればよかった)
- 憶測で回答がよくないと思い、不明瞭な事項の確認を求めたところ、「〜に決まってますよね。わからないんですか?」と煽られた
相手にってはどう転んでも非難されるので、あの回答になりました。
ただ、
>>353さんのように横で見ている人がわかりづらいのは申し訳ないと思っています。
内容を伴った指摘であれば回答する意思はあるので、お手数ですが、ご容赦下さい…。
>>388 あなたの回答は必要ありませんので、
曖昧な質問だと思ったら今後はスルーして下さい
アスペ的な突っ込みを防ぐための言葉遣いは、今後もするつもりはありませんので。
人間の言葉は伸縮性があり、
伸縮性のある言葉を自在に使いこなす人間の知性を俺は信用しているのです
曖昧な言葉は、いわばアスペフィルタです
アスペの回答はいりませんので、スルーして下さい
>>389 気を害してしまったのなら申し訳なく思います。
人を傷つけるつもりは無かったので、今後は発言を控えます。
391 :
353:2014/05/12(月) 20:03:52.72 ID:???
まーいいじゃん
変な質問はスルーってのは正しいとは思うけどね
delete演算子に()を付けていたのですが、これだと関数と間違えることがあるので
()を付けない方がいいのでしょうか?
>>375 > lodashのメソッドは通常非破壊的なようです
それは関数型言語的な考え方だよ。
細かい説明は端折るけど、関数型言語は原則的に
非破壊的な操作を行うためバグが減るとされている。
>>392 つけない方がいい。
var value = (1) みたいで気持ち悪い。
typeof も()つけないほうがよいですか?
・つける理由がない。
・つけない理由がある。
・どちらでもいいなら省略した方が楽
これを満たしているのなら、明らかにつけるべきではない。
・けつげわっさわさ
・けつげわっさわさでなくない
・どちらでもいいならけつげわっさわっさが好き
これを満たしているのなら、明らかにけつげわっさわさ
399 :
388:2014/05/12(月) 22:59:53.63 ID:REvGzu8p
>>390は私ではありません。
相手をするつもりはありませんが、自分の意図しない発言なので念の為。
idは出すべきでしたね…。気をつけます。
ご愁傷様
>>1の (10) を見れない質問者が多いね
殊勝なところがあると思ってこっちも心を痛めてたらw
安心しました
>>399 お前らの糞みたいなくだらないレスの投げ合いでスレが消費されるのは鬱陶しいから、
丸く収めようと思って謝っておいたんだから、のこのこ出てくんなよカスが
>>402 テンプレ修正されてないんだよな
後は察して欲しい
>>393 関数型言語の特徴として非破壊的だと見たことはあったものの、
使ったことがないのでピンと来ませんでしたが
実際に使ってみると良く分かりますね
>>395 演算子で括弧をつける必要があるのは優先順位を変更したい場合だけ
括弧の意味を考えれば他の演算子でもわかると思う
returnに括弧付ける奴の多い事よ。
var a = {};
a.value = 'hogehoge';
a.hoge = function() { return this.value; }
a.fuga = 3;
みたいにfunctionのうしろだけセミコロンをつけないのはなぜですか
他の言語やってれば、つけなければならないくらい分かるだろうに
>>408 俺の場合
1行→つける
複数行→つけない
みたいな感じでやってる
>>412 あなたの考え方を聞いているのではなく、なぜセミコロンをつけないのが一般的なのかを聞いております
var a ={};
var a ={a,b,c};
var a ={
a,
b,
c
}
あながち間違ってないかもその暗黙の了解ルール
〜
b,
c
}a=1;
or
〜
b,
c
};a=1;
>>413 セミコロンはつけるのが一般的
君の認識が間違い
>>416 function() {
return this.value;
}
この場合はつけませんよね
JAVAではセミコロンがないとパースエラーになりますが、javascriptはならないのですね
言語使用が雑ですね
min化したときにセミコロン無しや/**/してないとうわぁっとなる問題はどうしたらいいですか
>>417 SyntaxError なのでそれ以前の問題
セミコロンを省略すると発見しにくいバグが生じる例を
どこかで見たことがある
基本的に付けても無害なので
>>417 のような例だろうが何も考えずに付けた方がいいとも言える
Rubyでは付けないのが普通らしい。
だけど付けないと変な解釈をすることが有るってのは
やっぱり有るらしい。
function () {}
と
var a = function () {};
は別物。上は関数宣言、下は関数式。宣言には付けない、式には付ける。
たしかに複数行の式だと忘れやすいけど
jshint入れたら解決
if(a==hoge){}
には、セミコロンはつけませんね
ExpressionとStatementの違いが分かりません
文と宣言に違いはあるのですか?
関数宣言(function文)は文に含まれる
それなら、式と文は区別すべきでよいのではないでしょうか?
>>430 FunctionDeclaration と Statement は別物
function 文は存在しない
a();
function a() {}
これはエラーにならない。
a();
var a = function () {};
これはエラーになる。
a=1;
function a() {}
a();
これもエラーになる。
var a = 0;
一行にすると何故必要になるか分かる
var func = function () {}; (a == 0) ? 1:0; //typeof(func) -> "function"
セミコロンを外すと意図しない動作に
var func = function () {} (a == 0) ? 1:0; //typeof(func) -> "number"
宣言の場合はセミコロンが有ってもなくても意図通りの結果に
function b(){} (a == 0) ? 1:0; //typeof(func) -> "function"
function b(){}; (a == 0) ? 1:0; //typeof(func) -> "function"
lodashで、reduceなどのコールバック関数中に、
そこで使う変数を送り込みたい時はどうするのがベストなのでしょうか
今は外のスコープに書いてクロージャの形にしてますが、
これは関数言語的じゃないように思います
>>435 無名関数の中に実行したい関数を入れる
array.reduce(function() {
>>435 途中で送信してしまった
1.無名関数の中に実行したい関数を入れる
array.reduce(function() {
func(引数)//実行したい関数
})
2.関数を返す即時関数の引数を使う
array.reduce((function(仮引数) {
return function() {
//処理
}
})(実引数)
セミコロンの自動挿入は意図がよくわからないな
混乱するだけだと思うんだけど
>>437 なるほど
即時関数はよさそうです!
ありがとうございました
ループしながら判定してヒットした時点でループを抜ける
という処理がありますが、関数言語的ループの場合は例外を投げて外に出すのでしょうか?
lodashではfalseを返せばループは終わらせられるようです
メソッドチェーンを中断させる機構があれば尚いいのですが・・
なんか最近ココでlodashって単語よく見かけるんですが
流行してるんですか?
>>441 function exec() {}
function judgment() {}
function loop() {
var result = arg[1](arg[0]);
if (arg[2](result)) {
loop();
} else {
return result;
}
}
result = loop(arg,exec,judgment);
>>443 触らない方がいい
444はないなぁ
>>444 もしかして、あんた、アンチlodashの
うるさい人?
ちょっとそのコード見て、馬鹿にしたくなったんで
アンチlodashとイコールならレベル低すぎで面白いなぁとw
>>443 他の人は知りませんが、少なくとも俺の中では流行ってますよ^^
オブジェクト指向以来のインパクトです
function exec() {
return arguments[0];
}
function judgment() {
return arguments[0]!==10;
}
function loop() {
var result = arguments[2](arguments[1][arguments[0]]);
if (arguments[3](result)) {
return loop(arguments[0]+1,arguments[1],arguments[2],arguments[3]);
} else {
return result;
}
}
var arg = [0,1,2,3,4,5,6,7,8,9,10,11],
idx = 0;
result = loop(idx,arg,exec,judgment);
いい加減すぎたな。ちゃんと書くとこうか
loopの中のloopにreturn付けて、配列で引数を渡して
関数型で縛るとこうなるだろ?ようするに面倒なんだよ
偉そうなわりにコードが汚いw
これがアンチlodashの正体かって
思うと笑えてくる。
lodash使ってもいない人がメソッドチェーンの中断などというテクニカルな話題で
まともなアイデアを出せるわけないしw
テクニカルwwww
皮肉かwww
>>447 勘違いをしているようだが、関数型言語というのはオブジェクト指向よりも古い。そして不便。
その証拠に関数型を謳っている某ライブラリでも破壊的な非関数型メソッドがいくつも入っている。
ループ抜けるのにfalse返さないといけなかったら、関数型だとfalseしか返ってこないよねw
>>442 メソッドチェーンを中断させるのなら、例外しか無いんじゃね?
var value = _(v).foo().bar().baz();
のfoo()で中断させる場合、例外を出さないなら
[なんかのオブジェクト].bar() は絶対実行されるから、
それでvalueにundefinedを入れるようにするとなると、
「なんかのオブジェクト」は、メソッドチェーンできるオブジェクトでありながら、
barやbazを何をやってもundefined相当のオブジェクトを返すメソッドに
すり替えないといけないわけで、出来ないことはない気もするけど
そうとう無駄なことやる羽目になりそう。
>>442 > lodashではfalseを返せばループは終わらせられるようです
> メソッドチェーンを中断させる機構があれば尚いいのですが・・
中断の意味が二通りある。
一つは、処理が続行できなくなって中断する場合(戻り値なし)と、
もう一つは、これ以上処理する必要がないので処理を切り上げる場合(戻り値あり)
前者は例外を使う。
後者は、処理を切り上げることを意味する値を返す。
falseだったり、nullだったり、undefinedだったり、
この三つのどれかを処理を切り上げる値に使えばいいと思うけど、
無理なら例外を使ってもいいと思うし、特別なオブジェクトを返すとかもある。
asyncライブラリみたいに、引数にcallbackを渡してどう呼び出すかで
続きをやるかどうか判定するなんてのも考えられるよ。
http://qiita.com/takeharu/items/84ffbee23b8edcbb2e21 一般的な方法ってのは無いと思う。
「関数言語的ループ」って再帰ループのことだと思ったんだが違ったのか?
メソッドチェーンの中断の話?どこで掏り替わったんだ?
>>442の時点で二つの話がごっちゃになってるのです。
>>452 勘違いしてないよw
時代的な並列処理の要請と、あとおそらく「伽藍とバザール」から、
古い関数型言語の見直しが何年か前にあって、
新しい関数型言語が生まれたり、関数型言語のパラダイムが既存の言語に流入してきた
この新しい流れのことを言ってるんだよ
>>441 function exec(a) {
return a;
}
function judgment(a) {
return a!==10;
}
function loop(a,b,c,d) {
var i = d || 0,
r = b(a[i]);
if (c(r)) {
r = loop(a,b,c,i+1);
}
return r;
}
var arg = [0,1,2,3,4,5,6,7,8,9,10,11];
result = loop(arg,exec,judgment);
console.log(result);
これですっきり。
使えないライブラリを持ち出して、質問をそのライブラリの不備と掏り替えってアホかw
>>458 少しはましになったけど、引数dが余計だね。
もし仮にIDEを使っていて、関数の仮引数を表示してくれるとしたら
気持ち悪いよね。ということで消してみて。
あと意味なく一文字変数にしない。
わかりにくいから。
やはり例外しかないでしょうかね〜
うまく呼び出し部分をラップして特別なオブジェクトを返したら中断するとか出来そうな気もするのですが
>>458 dが消えてから指摘しようと思ったけど、
面倒なので私的。
元々の質問者は、その例で
exec,judgmentの二つに分けたくない場合の
話をしてるんだよ。
あと関数型なら、iというインデックスを使わずに
「残りの引数」って感じで渡す気もするんだけど、
まあそこはいいのかな。残りの引数を使う正当な理由が思いつかないし。
function loop(a,b,c) {
var arg = a.shift(),
r;
if (a.length>0 &&c(r=b(arg))) {
r = loop(a,b,c);
}
return r;
}
d,iが嫌ならこうだな。
exec,jugmentに分けなかったら戻り値がfalseしか返せないだろうに。
そんな縛りをする意味がない。
質問者がコードを出さないから具体案が出てきづらい事になる
初めからこうなることは明白だった
>>342 document.write("<a href='"+article[n]+"'>");
これは、ファイル名だけ?
それなら、相対パスになる
var artDir = "
http://www.〜.〜/"
記事が入っているフォルダのパスを、変数に入れておいて、
ファイル名と連結して、絶対パスで指定する
配列の宣言は、単に下のように書ける
var article = new Array();
var article = [];
にわか関数型野郎はhaskellスレにでも行って打ちのめされてこい
そして二度と来るな
>>463 こうすればいいんだよ。
function loop(data, callback) {
var i = 0;
var stop = false;
function recursive(i) {
if (i < data.length) return;
var result = callback(data[i], function() { stop = true });
if (stop) return result;
return recursive(i+1);
}
return recursive(i);
}
var data = [0,1,2,3,4,5,6,7,8,9,10,11];
var result = loop(data, function(value, stop) {
if (value == 10) {
stop();
}
return a;
});
訂正
function loop(data, callback) {
var stop = false;
function recursive(i) {
if (i < data.length) return;
var result = callback(data[i], function() { stop = true });
if (stop) return result;
return recursive(i+1);
}
return recursive(0);
}
var data = [0,1,2,3,4,5,6,7,8,9,10,11];
var result = loop(data, function(value, stop) {
if (value == 10) {
stop();
}
return value;
});
即時関数をapplyで呼ぶというウルテクを見つけました
(function (a){
console.log(a);
}.apply(this,['x']));
これは普通に使っていい技でしょうか?
存在しないdom要素のjqueryオブジェクトを生成した後、
そのdom要素を作成しても、
先に作ったjqueryオブジェクトを使って操作することは出来ません。
作成済みのjqueryオブジェクトに現在のdomの状況を反映させるにはどうしたらいいでしょうか?
>>471 > 注: この機能は ECMAScript 仕様の一部ではありません。
実装依存という事です。
全ての実装で実装されている保証がありませんし、今後削除される可能性もあります。
対象ブラウザ全てで実装されていることを確かめる必要がありますし、今後更新される度に該当機能が削除されていないか確かめる必要があります。
ありがとうございます
あまり使わない方が良さそうですね
欲しいエラーではない場合、再びthrowする
という判定処理を書くのがいいでしょうか?
ontouchstartってスマホ用のイベントだとおもいますが、
これをPCで閲覧した時にも記述することってやっぱりよくないことですか?
C++の int operator()() {...} みたいなメソッドは書けますか?
クラスインスタンスを関数のように使いたいのです。
function Foo() { .. }
var obj = new Foo();
obj(); /* 関数としてコールしたい */
ttp://ideone.com/zRugbf
残念ながら出来ません
>>475 こういうこと?
function Foo() {
function bar() {
console.log('a');
}
return bar;
}
var obj = new Foo();
obj(); // a
>>477 クロージャーではなくprotptypeでなんとか出来ないのかと思いまして。
>>476 そうかぁ、出来ないのですね。
ありがとん。
javascriptがflashに大勝利するにはどうすればいいと思いますか
ぼくはソースの暗号化が肝だと思うのですが
意味不明
flashなんてもうオワコンじゃん
>>474 PCかスマホかなんて忘れた方がいい。
あるのは画面の大きさぐらい。
タッチ装置がついててブラウザが対応していたら、
ontouchstartが使われる。そうでなければ使われない。
スマホかどうかは関係ない。
>>479 ソースの暗号化なんて、誰もほしがってなんかいない。
>>478 function f() {
console.log(this.a);
}
var o = {
a: 1
},
obj = f.bind(o);
obj(); // 1
o.a = 2;
obj(); // 2
bind使えばこう書けるが。
>>473 try-catch のcatch節でthrowするという意味なら普通はあまりやりません。
標準の例外を吸収しておいて別の例外を発生させるのは特異なケースですが、背景が不明なのでそれが正しいのかは何ともいえません。
普通は標準の例外を見越して、例外が発生しないようにコーディングするので、try-catch は滅多に使いません。
もし、「例外の発生条件がよくわからないのでとりあえず、try-catchで括る」という考え方なら良くない手法だと思います。
lodashで、変数でキー名を指定してオブジェクトに値を設定したい場合は
自分でプラグインを作成するしかないでしょうか?
assignの引数はオブジェクトにしか対応していないようです
jqueryのように
assign(key, value)
というような形でも指定できたら一番いいのですが
>>485 なんでlodashについては何も言わないんだ
そもそも、JSでメンバへの代入をメソッドで出来るべきでは?
{a:1}.set('b',2)
みたいな感じで
jsでhtmlのエレメントを取得し、属性値を設定します。例えばidとか。
この時、自動的にnameにも同じ値が設定すされるようにする。
みたいな仕組みを作ることは可能でしょうか?
チェックボックスにidと同じname属性を付けたいのだと思うが、
しまった、途中でカキコしてしまったw
jQueryが使えるなら、
$('input[type=checkbox]).each(function(){$(this).arrt("name", this.id)});
でどうでしょうか?
.arrt → .attrじゃないか
あと、idにattrしてかつnameにもattrしたい
ということだろうたぶん
PCでスマホサイトの動作を確認したいんですが、
Useragentを書き換えるだけじゃなくて、スマホ特有のイベントontouch系を発生させるツールとかないですか?
>>494 エミュレータを使えばいいのでは?
最終的には実機で確認する必要がありますが
>>490 もう少し具体的に。
要素と文字列を受け取って、idとnameとに設定する関数を作る
っていうのでも仕組みって言えば仕組みだよね
jQueryで$('.foo').setIdAndName('foobar') みたいな感じでしたければ、
そういうプラグインを書けばいいし
497 :
485:2014/05/15(木) 14:54:19.72 ID:???
>>488 あっちのスレは、jQueryだけじゃなかったのか
ライブラリ総合か
それなら、Lo-Dashの話もあっちで
次から、スレタイも変えないと
【jQuery】JavaScript ライブラリ総合質問所 vol.3【Lo-Dash】
まあ
>>488も分かってて言ってるんだろうけど
jQuery他をこっちで聞いてるのはライブラリスレを知らないだけ
lodashをこっちで聞いてるのは意図的な荒らしと自演レス
>>497 そのタイトルだとあなたと同じようにjQuery, Lo-Dashスレと勘違いされるから、特定のライブラリ名はタイトルに含めるべきではないと思う
でもJQueryも有名だしJQuery等でいいんじゃないか
どっちにしても向こうのスレで話し合えば良いと思うが
>>494 chromeのDeveloper toolでできる
502 :
490:2014/05/15(木) 19:24:33.83 ID:???
>>491-493>>496 現状jQuery使ってないので、新たな技術要素を増やすのは、できれば避けたいです。絶対ではないけど。
やりたいことは、例えばreadonlyとdisabledはについて、いずれか一方がtrueならもう一方は必ずfalseにしたいという具合に、排他的に設定するルールだとします。
この時、
xxx.readOnly=true;
xxx.disabled=false;
と書くのではなく
xxx.readOnly=true;
とだけ書けば、disabledも勝手にfalseになってくれる。そんな仕組みを作りたい。
C#なんかでいうと、プロパティの中にロジックを書くような事が出来れば良いのかなと思ってます。
jsにはprototypeとかあるので、その辺うまく使えば出来たりするんかなーと。
荒らしじゃねーよカス
ライブラリスレでjsの話をするのはおかしいが
jsスレでライブラリの話するのは何もおかしくない
うざい自治厨がスレを分けただけの話
つまりどっちに書いてもいい
lodashの関数型プログラミングに慣れるとスコープが無駄に広い変数にイライラするね
どこで使われているか一目で分からない変数とかあり得ないだろ
>>502 ウェブ製作者必須の技術でjQueryを作ると、
簡単にできるということを知っておいて。
簡単に早く不具合がなく品質の高いものを作ろうとするのなら、
技術を身につけるべきだということを知っておいて。
自分独自の面倒な仕組みを作りたいというなら、その理由がマイナス、
つまり勉強したくない、自分の知ってることだけでやりたいだったら、
なにも成長しないということを理解しておいて。
その上でやりたいのならどうぞ。
じゃあjQueryだったら簡単にできるというコード。
var state1 = {readonly: true, disabled: false};
var state2 = {readonly: false, disabled: true};
$('.test').prop(stete1); // classがtestの項目 "全て" をstate1に変更
視野が狭い奴ってレベルの低い話をドヤ顔で語っちゃうんだよねw
この場合、質問者が求めているのは
>>504みたいなのであって、
>>507は質問に対して的外れ過ぎだろ
無能なやつほど偉そうにしたがるんだよな
「プログラマーに向いてない」とか「成長しない」とか「スレ違い」とか言う奴はだいたいクズ
>>513 お前は、言う奴じゃなくて、言われる奴だから
大丈夫だねw
無能なやつが他人に偉そうにしたいと思ったら規則を作り出す
規則への従順さを議題にする限り、能力が問われることはないから。
自民党がやろうとしているのも根源的にはそういうこと。
現在日本で進行しているのは、まさに無能者によるテロリズムだ。
この手のネット特有の現実批判しかできない奴って、考えるのが技術であることを知らないんだろうな
みんな借り物の言葉だもんな
外部ライブラリを導入したくない理由なんかいくらでもあるだろうに・・・
自分の中だけで勝手に妄想膨らませて語っちゃう奴っているよなw
借り物の言葉で自分に酔えるというのは、ある意味才能だと思うよ
>>516 それは単にお前がいつも言われてることだろw
こんなことを言っている書き込みがあったら持って来いよ
カスが
アホは批判すらマトモに出来ないから、
かつて自分が言われた批判を間違ったタイミングで取り出してくるよな
お前が言われた言葉はお前にぴったりなんだから
自動追尾でお前にぶつかって行くに決まってんだろ
カスが
よほど図星だったみたいで、一回レスしただけじゃ気持ちがおさまらなかったんですねw
単に教えてあげただけだよ
もともと怒ってもないし
私も教えてあげますが、怒ってない人はカスがカスがなんて繰り返さないものですよw
それは沸点の低い証拠です
そうですか
ありがとうございました
自分の気持ちをコントロールできるようになれば、少しは冷静に自分の頭でものを考えられるようになると思いますよ
考えすぎかもしれんが、
>>507の回答見る限り、
成長できないのはこいつ自身な気がしてきた。
>>526 なんでそんなどうでもいいレスしたいの?
したくなったの?
別に考えすぎじゃないだろw
catchブロックのeを宣言せずに使えるのは何故ですか?
531 :
490:2014/05/16(金) 09:22:22.30 ID:???
>>504>>529 おっ、これは面白い。これは知らなかったです。
ecmascriptの仕様なら標準技術といえるし、
サポート対象環境で動きそうなら、検討させていただきます。
ありがとうございました。
>>507 jQueryを使うという選択をしたならば、そういうやり方もありですね。
桁が大きすぎて3.5345345345346564e+23みたいな値同士を比較しても正しい結果になりません
これはしょうがないことですか?
あとこういうe+23みたいなのがくっついてしまったかどうかを判定する方法はありませんか?
>>532 最大どこまで扱うのかしら無いけど、JavaScriptネイティブで
扱える範囲を超えているからどうしようもの無い。
何かしらのライブラリを使うしか無いね。BigIntとかのキーワードで検索できる。
このスレにはライブラリの話をするとうるさい奴がいるから注意してね。
スレ違いではないから問題ない。軽く無視しよう。
parseFloatを通して比較すればどうかな?
if (parseFloat(a) > parseFloat(b)) { ... }
指数表記が有るかは、if (a.search(/e/)>0) {...} で判定。
正攻法はBigIntだろうね。
es6なんて使えないんだから意味なくね
自分一人で動かすプログラムならともかく
>>536 だから「なければ作ればいい」といっているのだが
じゃES6の話なんてすんなよ
知ってれば将来の互換性を確保出来る
>>538 Number.MAX_SAFE_INTEGER は Google Chrome, Firefox で使える
ES6 が使えないわけじゃない
おちつけ
始めのBigIntでミスリードしたことを踏まえると、全員間違ってたんだな…
lodashで何とかできるんじゃね?
ふと思ったのですが、Int64 を標準化した仕様はないのでしょうか?
探してみたのですが、探し方が悪いのか該当仕様が見つかりませんでした
>>503 まあ、その質問が増えてきたなら、啓蒙ができたって事で専用スレでやっていいな
ま、ライブラリ専用もあるし
int64を扱うライブラリがあったような記憶が
32ビットでじゅうぶんですよ。
32ビットでじゅうぶんですよ。
分かってくださいよ!
551 :
Name_Not_Found:2014/05/16(金) 22:34:42.83 ID:6hsl02bR
xmlHttpReques2でクロスオリジン通信できるようになったけど
結局サーバー側のheaderで許可しないといけないならどういう時に使うんだろう
誰かが公開してるAPI扱う時くらい?
var i = 5;
for (var j = 0; j < i / 3; ++j) { console.log(j); }
=> 0
=> 1
JavaScirptは糞でした
ありがとうございました
>>551 自分が管理する他ドメインとの通信とか
そもそも、あれは他ドメインサーバのデータを無許可に取得できるようにする為の仕組みじゃない
555 :
547:2014/05/16(金) 23:35:03.73 ID:9YSJ/oxP
>>549 ライブラリではなく、標準化された仕様はないのでしょうか
なければ、せめて各ブラウザで独自実装した仕様があれば...
lodashの話題をTwitterのあごちゃんがよく呟いてたけど。。。まさかね
そろそろ多倍長整数にも対応してもいい時代なんじゃないの
誰やねんw
関数言語的に書き直していくと、今までのコードのアラが見えてきて
くそコードを書いていた自分に凹んできますが、俺だけでしょうか?
>>554 C言語系(C,C++,Javaなど)は0しか出力されない
知らずにいると痛い目にあう
>>558 俺は、prototype.jsが無い時代に、lodashでいうeachなどのようなものを
当時関数型言語の知識もなかったが、自作していた。
ループが一行で書けるという程度のメリットしか当時は理解していなかったけど。
このように、昔自力でやっていたことが、後から
世間一般ではこういう風に言われているんだと知ることが多い。
たとえば、ネットもパソコン通信もない小学生時代。記憶媒体=紙に
BASICのコードを書いている時、コードが複雑になるからという理由で
FORとNEXTの対応をインデントをして線でつなぎ、GOTOでその中には
飛ばないようするという俺ルールを考えだしていた。
勉強することは大事で時間の節約になると思う反面。
自力で考えだしてる自分は、プログラミングと相性が良いなって思うw
>>559 純粋な興味本位で聞くのだけど、どういうロジックで 0 が出力されるの?
>>551 そもそも今までオリジン制約があったのはセキュリティーの観点からで、
サーバー側もクロスオリジンリクエストはできない前提でセキュリティー対策を考えてた
それがたとえば突然、新規格ではクロスオリジンリクエストできますってなったら当然困るわけで、
サーバー側が対応しないと使えないような今の仕様にするのは当然
>>561 C言語だと整数型同士の演算結果は整数になる
別にこれに関してはjavascriptが糞だとは思わないけどな
ただの仕様の違いであって
>>563 レスありがとう
つまり、5/3 === 1 になるわけね
for (い;ろ;は) { に }
javascript い→ろ→に→は→ろ→に→は→ろ...
その他 いろは→に→ろ→は→に→ろ...
ということでしょうか
>>564 俺もそう思う
これは突き詰めると「変数に型がないのがNG」と主張しているのと同じ
>>566 あー、うん、それでいいよ。
あと10年勉強しな。
569 :
566:2014/05/17(土) 00:40:24.94 ID:???
すみません
>整数型同士の演算結果
ということでしたか
把握しました
その変な演算が問題になることなんてないだろ
重箱つつきすぎ
5/3 === 1 ?
は?クソじゃん
console.log(5/3===1)
普通にfalseですが?
なめてんのか?
え? お前ら馬鹿なの?
5 / 3 = 1.666666666666667 なんだから、
j が 1.666666666666667 未満までのループで
0 と 1 しか表示されないの当たり前じゃん。
整数になるとか関係ねーしw
> 5/3 === 1 ?
> は?クソじゃん
はC言語のこと。
意味分からん
0と1とかざっくりしすぎだろ
原始的言語と一緒にすんな
そもそも現代の言語で5/3が0になるモンなんてないだろ
何でそんなこと言いだしたんだよ
このやろうばかやろう
>>576 あなたに呪いをかけた
> このやろうばかやろう
という、言葉を聞くと、
この夜老婆か犯ろう
という漢字に脳内変換してしまう呪いを。
5/3=1ってc言語っていうかアセンブラの演算だろw
>>552 言ってる意味がわからん
j<1なら0だけ出力されるが
j<1.1なら0と1が出力されて当然だよね
ようするに原始人がJSにも原始性を要求して
それがなかったからディスっただけだろ
そんな原始性はない方がいいんだからむしろ褒め言葉です
5/3が1になるほうが糞じゃね?
仕様って言ってしまえばそうだけど
int型なんだから当たり前じゃん
勝手にfloatに変換されても困る
jsにint型なんてねーから
だから整数が無いのは糞仕様と言うこと
そんなのスクリプト言語なら普通だからw
原始人乙
型が無いPythonですら5/3=1だ
>>584 > 5/3
1.6666666666666667
このスレにはJavaScriptしか知らない奴だけだってのはわかった
>>590 ちなみにJavaScript以外に整数が無い言語を知らない
あったら教えてくれ
>>591 確かにpython3だと実数になった
5//3が整数か
随分無謀な仕様変更したもんだ
>>593 哀れww
パイソン3が無謀なんじゃない
お前がアホなだけや
5 / 3は現実的に考えて小数になる
整数が欲しければ計算後に整数に変換すれば?
5/3が勝手に整数にされて切り捨てなのか切り上げなのか四捨五入なのかマイナスではどうなのか仕様全部把握しとかないと使えない糞仕様
把握せずに作り始めるのかよ
>>596 > 5 / 3は現実的に考えて小数になる
なんねーよw
5.0/3.0 → 1.666666…
5/3 → 1 余り 2 だろ (余りは同時に取得出来ないから 5 % 3 で計算する)
算数もできねーのかよ
599 :
565:2014/05/17(土) 01:59:29.93 ID:???
まさか、こんなに荒れるとは...
言葉足らずでごめん
C言語では「5/3 === 1」になり、JavaScriptでは「5/3 -> 1.6666666666666667」になる
言語仕様の違いがあるだけで、どちらがいいというものでもないかと
こんなの荒れるというほどではないな
どう見ても責任
>>552にあるだろw
なんで謝るんや
var i = 5;
for (var j = 0; j < (i / 3|0); ++j) { console.log(j); }
ようするに整数を想定している所は |0 を念入りに仕込む必要がある
console.log((Math.random() * 100000) % 5); => 4.623614703014027
みたいにMath.random()も知らないでいるとハマる可能性がある
Math.random() じゃなかった % の方だった
しかし % が実数の余りを返すってのは正直便利でもある
>>598 循環小数って知ってる?
小学校じゃ習わないか
ごめんね
>>604 有理数か分数って言え
自然数⊂整数⊂有理数(分数)⊂無理数⊂実数⊂複素数
だ
なんでお前ら下らないことで言い争いしてるの
両方ともよそでやれよ
関数言語的なプログラミングをすると、
一つの処理の中で二種類以上のものを作ることに違和感を感じます
reduceが一つのものしか返さないように出来ているということもありますが、
単純に、美しくない、関数言語のパラダイムとそぐわない、と感じます
こういう場合どうするのがいいのでしょうか
関数言語におけるデザインパターン的なものとか、出てるんでしょうか
>>607 ECNMAScriptは関数言語じゃない
>>609 関数言語でないのに関数言語的アプローチを目指すことが間違い
JavaScriptは関数型でもオブジェクト指向型でもありません
無理やり関数型やオブジェクト指向っぽく書こうとするのはやめましょう
>>610 その言語の特徴を活かしたアプローチをスレばいいんじゃないの?
つまり、関数型とオブジェクト指向の両方を
バランスよく取り入れた言語なんだから、
関数型とオブジェクト指向の両方のアプローチを
バランスよく行えばいい。
どちらにしろ何らかのアプローチをしないといけないんだしさ。
>>612 関数型言語的性質がないから
>>607のような問題が起きているのだと思うのだけど
それでも異論があるなら、関数言語的アプローチとしてあなたが具体案を提案すべきでは?
>>607の問題ってなんですか?
一つの処理で二種類以上のものを作ることでしょうか?
関数型言語では、そんなことしないですよ?
JavaScriptは関数型言語の思想が混じっているので、
関数言語的アプローチでいうからこそ、
>>607の問題はできないのです。関数型言語だから。
>>614 横からだけど、ちゃんと質問に沿った回答を心がけた方がいいよ
>>612とニュアンスが微妙に変化してるし、その突っ込みは本当に必要だったの?
初めから
>>614の回答だけなら何も言わないけどさ
>>614 > 一つの処理で二種類以上のものを作ることでしょうか?
詳しくは知らんのだが、関数型言語はリストで返り値を持てたような
俺の記憶違いかな?
詳しい人の説明を求む
それならJavaScriptも配列を返せばいいじゃない。
https://developer.mozilla.org/ja/docs/Web/JavaScript/New_in_JavaScript/1.7 分割代入 (destructuring assignment) は、配列やオブジェクトの
リテラルの構造とそっくりの構文を使って、配列やオブジェクトからデータを抽出することを可能にします。
複数の値を返す
分割代入のおかげで、関数は複数の値を返すことができます。関数から配列を返すこと自体はいつでもできたものの、分割代入はさらなる柔軟性を提供します。
function f() {
return [1, 2];
}
見ての通り、すべての返り値を角カッコで囲んだ、配列に似た構文を使ってその結果を返します。
この方法で任意の数の返り値を返すことができます。この例では、f() はその出力として [1, 2] を返します。
var a, b;
[a, b] = f();
document.write ("A is " + a + " B is " + b + "<br>\n");
619 :
Name_Not_Found:2014/05/17(土) 16:29:12.65 ID:vKHtBQrX
フレーム内のコンテンツを印刷にあたり
frames[frameName].print();
というコードを書いています。
これでうまくいっていますが、IE10においては
window.print(); したときと同様、全画面が印刷されてしまいます。
フレームへのアクセス方法が他にあるんでしょうか?
620 :
619:2014/05/17(土) 16:31:10.22 ID:vKHtBQrX
フレームと書いた部分は、正確には iframe です
>>618 素朴な疑問だが
> 配列に似た構文を使ってその結果を返します
とあるが、 配列そのものを返しているようにも見えるが
「配列に似た構文」とは関数の中の return ではなく
代入の左辺を指すのではないのか?
var a = f();
var [b, c] = f();
があるとき a は配列になるのでは?
function f() {
return new Array(1, 2);
}
だったら?
622 :
619:2014/05/17(土) 16:56:27.58 ID:vKHtBQrX
スミマセン、うまくいきました。IEでは次のように先にfocusする必要があるようです。
frames[frameName].focus();
frames[frameName].print();
印刷データのキャッシュなどの関係でうまくいってる可能性もあるので、
尚、確認してみますですm(_ _)m
>>621 > 「配列に似た構文」とは関数の中の return ではなく
> 代入の左辺を指すのではないのか?
「配列に似た構文を使って」だから文章的には矛盾はないと思うけど...
あなたの理解で合ってる
指定した関数を何回呼ばれたか分かるようにするライブラリみたいのありますか?
JavaScriptプロファイラ で検索
>>624 http://ideone.com/HVfnDI function foo() { } /* カウントしたい関数 */
var count_hash = {};
function callcounter(func) {
count_hash[func.name] = 0;
return function() {
count_hash[func.name] += 1;
return func.apply(this, arguments);
};
}
foo = callcounter(foo); /* fooをクロージャと差し替え */
for (var i = 0; i < 100; i++) {
foo();
}
console.log(count_hash.foo); // 100
>>626 指摘するとしたらこんなところかな。
・関数名がかぶると困る
・count_hash がグローバル変数なのでよくない
・+=1よりも++の方が一般的で短いので推奨
で上記の指摘点を考慮しつつ、こんな感じのインターフェースにするといいかもね。
counter = call_counter(foo); // fooをクロージャと差し替えてカウンターオブジェクト生成
foo()呼び出し省略
console.log(counter.count);
もしくは
before_hook(foo, function() { count++; }); // 関数呼び出し前にフックを仕込む
foo()呼び出し省略
console.log(count);
>>627 ・counter がグローバル変数なのでよくない
>>627 このインターフェイスでどうやってfooを置き換えられると?
寝てないからなぁw
メソッドが属するオブジェクトも
引数に入れてやってください。
俺ならこうする
カウントしたい関数=test();
function test(){}
↓
xxxx=0;//global
function test(){console.log(xxxx++)}
これじゃイカンのか?態々getterみたいなことせんでも
指定した関数名じゃなく指定した関数のカウント回数
>>634 指定すらしてない
countTest = 0;
function test(){
countTest++;
console.log("test");
}
test();
test();
console.log(countTest + "回呼ばれました");
だめだ わかってないなぁ
×わかってない
◎質問者の説明不足
http://jsbin.com/yufumaqe/1/edit ありがとうございます
高階関数?を使ってこんな感じで出来ました
lodash最高ですね
_.mixin({
countable: function(fn){
var wrapper = function wrapper(){
var result = fn.apply(this,arguments);
wrapper.counter++;
return result;
};
wrapper.counter = 0;
wrapper.getCounter = function() {
return wrapper.counter;
};
return wrapper;
}
});
function test(s){
console.log(s);
}
var countableTest = _.countable(test);
countableTest('hoge');
countableTest('hoge');
countableTest('hoge');
console.log(countableTest.getCounter());
これはどうですか
function a() { return true; }
function b() { return true; }
function _(fn_name) {
var fn = window[fn_name];
window[fn_name] = function() { window[fn_name].count++; return fn(); };
window[fn_name].count = 0;
}
_('a');
_('b');
a(); console.log(a.count);//1
a(); console.log(a.count);//2
b(); console.log(b.count);//1
b(); console.log(b.count);//2
>>639 誰もlodashに触れてないのにどこから出てきたんです?
最初から触れるとレス貰えなくなるから学習したんでしょ
>>640 ありがとうございます
fn.nameにしてこちらを採用させていただきます
>>640 これグローバルに無い関数は計測出来ないじゃん0点
プロファイラで計測する以外に方法はない
>>641 高階関数とlodashの親和性は高いので。
もちろんlodash使わなくても出来ますよd(^_^o)
結局、
>>626と同じじゃねーかw なんでこんなに手間増やしてベンチ激遅にしなきゃらんのだw アホ過ぎる
今の時代はベンチ速度よりも、
メンテンス性の方が重要視されるからだよ。
何をとるかは目的によるのであって、時代は関係ないねw
いや関係有るよ。正確に言えばパソコンの性能だが。
ほんの15年前まで、速度が必要な所にJavaScriptを
使うこと自体ありえない話だった。
速度が気になる? じゃあJavaScriptなんかやめろよ。
これが常識だった。
JavaScriptのリクエスト数の方が問題になるからねぇ。
目的がリアルタイムゲーム以外なら、
JavaScriptの実行速度を考慮する必要はない
という結論でいいんじゃないか。
趣味でやってる人は、0.0001秒にまで
こだわったりするからなw
おかしいのはベンチの取り方
100万回のループで10秒も時間が違ったのだ!
1秒の方が10倍も速いんだぞ!
10倍もの差は無視できない!
でもそれ1回あたり0.00001秒ですよね?
なるほど。ベンチの取り方かえたら、おかしくなくなったわ
2<<1と2*1って速度変わりますか?
処理系の実装によるだろうね。
このケースなら構文解析で定数に置換されるだろうから、
速度は同じになるんじゃないかな。
俺がそうだったので速度厨の気持ちも分かるが
lodash化する過程で大量の無駄な処理に気づいた
部分的なベンチマークに拘ると全体的なアルゴリズムが洗練されないのだな
関数言語的プログラミングは汚さを許さないというか、
汚いところが浮き上がって見えるので、処理が洗練されていく
dom要素をcloneNode(true)して、id属性だけは削除したいです
しかしcloneしたもののidにヌルストリングやnullを代入しても消えません
deleteで削除しても駄目です
どうすれば消えるのでしょうか?
removeAttrib
それ用のメソッドがあったんですね
ありがとうございました
テキストを書き換えるときはinnerHTMLを使うとDOMが壊れるからやめろっていいますけど
これってバグなんじゃないのでしょうか
違うでしょうね
そんな話聞いたことない
じゃあまず聞いたことある人いませんか?
<span id="testnode">before</span>
a=document.getElementById("textnode");
a.innerHTML="after";//これはOK
<span id="testnode"><a href="
http://hoge.com/">before</a></span>
a=document.getElementById("textnode");
a.innerHTML="<a href=\"
http://hoge.com\">after</a>";//これはだめ
という話 そしてやめろってのはeval系みたいな作用でブラウザによろしくないという話で
動くには動く。ただそんなコード使ってる人は初心者と言われて当然
<span id="testnode"><a href="
http://hoge.com/">before</a></span>
a=document.getElementById("textnode");
b=document.createElement("a");b.href="
http://hoge.com/";
b.innerHTML="after";a.appendChild(b);//こうするのが通常
これは10000回繰り返すと速度が10倍遅いんだけどとかいう話ではなく
数十回レベルでもハッキリと遅いのが見える 明らかにブラウザに負荷をかけてる
>>663 テキストを書き換えるなら
element.textContent や textNode.data の方が
より適切ってことではないの?
( < や > は実体参照に置換してくれる)
実際に要素を生成することも含むならやめる必要はないと思う
(その場合に DOMが壊れるとは具体的に何を意味するのかわからん)
testnodeとtextnodeが間違ってることに気づいた
そしてDOMが壊れるってのだとこっちかー
<div id="aaa"><div id="bbb">cliok!!</div></div>
a=document.getElementById("aaa");
b=document.getElementById("bbb");
b.addEventListener("click", function(){alert("test")},false);
a.innerHTML.replace("cliok","click");//イベント消えちゃうよー
連投すまん 三度目の正直、次からはしっかり確認する。最終行
a.innerHTML=a.innerHTML.replace("cliok","click");
が正解
innerHTMLはdomを真新しいものに置き換えるので
変数がその参照を持っていたらまずいとかその程度のことだろ
>>665 え、驚きなんですが・・・?
徳丸先生とかあごちゃんのtwitterチェックしてませんの?
ちょっと前に話題に上がってるネタですよ
>>664-666 無知って恥ずかしいですね
>>667 evalみたいなっていうのは何の話なのかよくわかりませんが
そういうことではなくてinnerHTMLで書き換えるとDOMが壊れるのでXSSが起こるのはinnerHTMLがdomのめんどうみないのがおかしいんじゃないかって話です
JavaScriptの情報のアンテナ低いやつ多すぎて話になんねえわ
だからなんでdomが壊れるんだよ
壊れねーよ
>>676 情弱バカは書き込むんじゃねえよ
壊れるんだよ
壊れてたまるかよw
そんなことで壊れるならプログラム動かねーから
>>673 いくつか想像はつきますが、事象を特定できないので質問するならもっと正確に質問して下さい。
「DOMが壊れる」って何ですか?
本当に理解できているのかあやしくなる表現ですね。
あきらかに理解してないだろ
他人の書いた文章をそのまま使うな
自分の頭で咀嚼してから自分の言葉で表現しろ
それがB級以上のプログラマーの在り方だ
innerHTMLにどんな値を代入しようが、「壊れる」ということはないと思うんだけど
「想定しない木構造になってしまう」という意味?
なんにせよユーザー入力された値を信用してそのまま使うなというのはHTMLに限らずだね
なるほど
一理ある
>>674 これはinnerHTMLのバグじゃないだろ
domが壊れるんじゃなくてinnerHTMLが間違ってるんじゃん
フォームごとinnerHTMLで渡すとかどんな状況だ?
そんなくそコード普通は書かないから
>>682 理解出来なくて質問するのはいいとしても、「知ったかぶりで適当な事を発言して、他人に知らないんですか?」と嘯くのは勘弁してほしいわ
>>これってバグなんじゃないのでしょうか
バグ以外の何ものでもないだろうな
よく分からないから単純な再現コード書いてください
>>687 いや理解できないのはお前がそれを知らないから理解できないだけ
>>680 を全文読みましょう
少なくともinnerHTMLに関連する箇所だけでも読みましょうね
何者にもなれないお前たちに告げる
↓
ここで聞いたおれが一番のバカだったわ
コアな部分にはあんまり興味のないお遊び野郎しかいなくて残念だ
確かに金にならないものに興味は無い
いやだから実証コード書けよ
そんなのいちいち読んでられるか
単純な実証コードって言ってんだろ
お前が理解した範囲で書けよ
「ボクちゃんは自分で考えることも出来ないので
代わりに考えてください」って言ってるようにしか見えない
>>690 なら初めから具体的に質問しろよ
質問者はどれにも触れてないのに、質問内容が理解出来る訳ないだろ
>663から>680を確定させるには情報が不足してるとは思わないのか
>>696 単純なコードというレベルのものが
>>680ありますよ?
初級者は無理に回答しなくていいのよ^^
>>698 もうね情弱は無理に答えなくていいって
innerHTMLのバグを知らないお前はくちだすなよ
innerHTMLのバグが一つだけだと確信している時点でいろいろとダメだな
あのーこれは脆弱性の話なんですから、
innerHTMLで書き換えると壊れるんじゃなくて
innerHTMLに入れる文字の話でしょう?
初めから
>>680を出していたならここまで荒れなかっただろうに
質問の仕方がお粗末だったな
どれが質問者か区別つかないし、
>>680で確定なのかも怪しいよ
質問者だけはわかってるんだろうけどね
荒らすための質問だからな。
これがアスペフィルタの人なのか?
いろいろと酷い
こんな奴と一緒にすんなカス
あの人もわさと曖昧な質問をしてたからまあ、似たようなものか
<script>
var canvas;
var c;
function draw() {
c.fillText("test", 10, 20);
}
function init() {
canvas = document.getElementById("canvas1");
c = canvas.getContext("2d");
}
</script>
は通るのに
var canvas = document.getElementById("canvas1");
var c = canvas.getContext("2d");
として外部変数にするとエラーがでるのはなぜでしょうか
内部変数にすると、の間違いじゃなくて?
内部変数にすると、で正しければ
init内でvar 〜と宣言した変数は、init内でのみ使えて、init外では使えなくなるのです。
そして、外で同じ名前の変数があった時は、その内容を変えず維持します。
a="1111";
function test(){
var a="2222";alert(a);
};
test()//2222と表示される(test内部でa=2222となっている)
alert(a);//1111と表示される(外側のaは2222になっていない)
>>709 その init() が呼び出されるタイミングと
var canvas = document.getElementById("canvas1");
が評価されるタイミングが違うんでないのか
getElementById は文書が(より正確にはその要素が)読み込まれていない時点で呼び出されたなら、当然 null を返す
styleは属性の個々の子属性も削除するにはremoveAttributeした方がいいんですか?
713 :
709:2014/05/19(月) 01:29:59.09 ID:???
みなさんありがとうございます
>>711 <body onload=init()>
var canvas = document.getElementById('sample');
var ctx = canvas.getContext('2d');
function init() {
ctx.clearRect(0, 0, 200, 200);
ctx.fillRect(0, 0, 10, 10);
}
これはまだ読み込まれていないのですか?
上の方で言ってる問題って
フォーム関係の要素に``が入っていたらinnerHTMLが文字化けするってことですか?
それと文字化けは関係ない
>>713 その記述のみから断言はできないがおそらくそうだろう
スクリプト実行と DOM の読み込みタイミングについて調べるべし
onload はDOMと画像などのリソースが読み込まれた後に実行されるので
canvas = ... , ctx = ... を init()の中に入れればおそらく動く
内部変数とかは関係ない
質問者はもちろん回答者もこの問題の本質を分かっていないように正直みえるのですが・・。
問題の本質は何でしょうか?
>>718 最初の質問
>>663 で innerHTML はバグとか言っている所から
誤解と混乱を生じさせたことが問題
バグとは仕様に沿わない実装のふるまいを意味するものであり
セキュリティ云々とは関係ない
真の意味の「問題」は質問の中には元々存在していない
いや、バグはありますよね?
でもDOMが壊れるってのは否定されましたね。
元の質問はこの際どうでもいいですが
質問者はinnerHTMLに問題があるということを報告をしたのですから
それについては認識しておくべきでは?
<div id="hoge">
〜HTMLの表・10KB分〜
</div>
という大きめの表がHTML内にあって、
同じHTMLページ内に全く同じ「〜HTMLの表・10KB分〜」を
もう一度表示させたいのですが、
1行くらいでサクッと表示できるScriptはないでしょうか?
[key,value,key,value]
となっている配列からオブジェクトを作る関数は
lodashにないのでしょうか?
>>723 html
<div id="hoge">
〜HTMLの表・10KB分〜
</div>
<div id="fuga">
</div>
javascript
document.getElementById('fuga').innerHTML = document.getElementById('hoge').innerHTML;
forEachなどで1以外の増分のループを実現するにはどうしたらいいのでしょうか?
727 :
723:2014/05/19(月) 09:25:14.68 ID:???
>>725 ありがとうございました!
ずっとHTMLの容量ばかり食って困っていたんです
>>719 innerHTMLで書き換えるとDOMが壊れる事でXSSを発生させる原因になる
セキュリティと関係ない話ではない
これで話がわからないともうあなたは話の輪に入れないから食いつかないほうが良い
>>726 function hogeEach(array,m) {
if (array.length-m>1) {
array.forEach(function(_element, _index, _array) {
if (_index<m) { return; }
console.log(_element);
});
} else { return m; }
return array.length;
};
var arr = [1,2,3];
var index = arr.length;
// update
arr.push(4);
arr[arr.length] = 5;
index = hogeEach(arr,index);
// update
arr.push(6);
arr.push(7);
index = hogeEach(arr,index);
// update
arr.push(8);
index=hogeEach(arr,index);
// update
arr.push(9);
index=hogeEach(arr,index);
>>729 innerHTMLの読み出しがおかしいだけだから「domが壊れる」はおかしい
domは壊れない
>読み出し
>読み出し
>読み出し
>読み出し
>読み出し
え、どうしたの
発狂したの
もう触んないほうがいいって
人をdisりたいだけの奴らがこれだけいるんだから、語彙には注意すべきだよなとは思うわ
どう見ても人をディスりたいだけの奴の意見だな
スレ違いじゃなくて、板違いだねw
勉強しているわけではないのでしたら今から勉強してください
innerHTMLが脆弱性を起こすのではなくて、
エスケープしてないから脆弱性を起こすという話
SQLはインジェクションを起こすから
使うなといっているようなもんw
そんな話じゃないだろw
>>740 そんな表面的な話じゃない
もっと深い内部仕様の話
contenteditable領域でも読み取ったら文字が変化してることはあるのでしょうか?
「innerHTMLで読み取ったら」でした
もしそうならDOMから読むとかしないといけないのでしょうか
引数の順番についてですが、
挿入するデータと挿入される要素があったとしたら
どっちが先になると思いますか?
insertHoge(data, element)
insertHoge(element, data)
dotch?
質問です
var i=0;
function fun(){
if(i==0){
i++;
fun();
}else{
return 999;
}
}
function print_1(){
var hoge =fun();
alert(hoge);
}
とやるってprint_1()を実行するとundefinedが表示されます
関数を2回実行されるとタイムラグみたいなのが発生するんでしょうか?
>>747 そのコードは次と等価になる
var i=0;
function fun(){
if(i==0){
i=2;
return undefined;
}else{
return 999;
}
}
749 :
747:2014/05/20(火) 02:34:42.01 ID:???
>>748 やっぱ1回目のが返り値として入っちゃうんですか
fun(){
func()
}
でもちゃんと2回目の返り値が入るまで待ってもらう方法ってないんですかね?
>>749 >待ってもらう
何を求めているのかわからん
1 回目と2回目から先は どうふるまわせたいのだ?
>>748 訂正
× i=2;
× i=1;
>>745 >しかも、要素を処理する順番は決まっていないし、指定もできない
そんな筈は無い
for in と取り違えてないか?
内部関数を使うのじゃ
var i=0;
function fun(){
if(i==0){
i++;
return fun();
}else{
return 999;
}
}
>>746 関数の内容に依存するとしかいえません。
必須の引数を第一引数にはしますが、どちらが必須か判断できる情報が出てないので。
蛇足ですが、Function#length があるのでオプション扱いの引数なら仮引数は指定しません。
>>746 どっちとかはないからDOMの操作と合わせてみるとかはどうですか。
var insertedElement = parentElement.insertBefore(newElement, referenceElement)
ネストされたオブジェクト
hoge.moge.poge.page
にアクセスしたいですが、hogeの内容は不定で、
hoge.moge
などが存在する時もしない時もあるとします。
もし存在しない時に
if (hoge.moge.poge.page)
のような条件判定をすると、末端のpageの有無を調べる前にエラーになってしまいます
こういった複数階層のオブジェクトの属性をエラーを出さずに調べることの出来る
ライブラリみたいのありませんか?
>>756 var hoge = {};
if(hoge && hoge.moge && hoge.moge.poge && hoge.moge.poge.page) { console.log(hoge); }
hoge.moge = {}
if(hoge && hoge.moge && hoge.moge.poge && hoge.moge.poge.page) { console.log(hoge); }
hoge.moge.poge = {};
if(hoge && hoge.moge && hoge.moge.poge && hoge.moge.poge.page) { console.log(hoge); }
hoge.moge.poge.page = {};
if(hoge && hoge.moge && hoge.moge.poge && hoge.moge.poge.page) { console.log(hoge); }
ありがとうございます
ですがこれは例で、階層を構成するキーの名前や深さは毎回色々変わります
>>756 構文的には
((( hoge || {} ).moge || {} ).poge || {} ).page
のようにするのが単純かな
しかし例えば hoge.moge が undefined でもオブジェクトでもない場合はエラーになる
より汎用的には
function getNested(obj, names){
// obj は根元のオブジェクト, names は名前の配列
for(var i = 0; i < names.length; i++ ){
if(obj instanceof Object){
obj = obj[ names[i] ];
} else if (obj === undefined){
return undefined;
} else {
??? // undefined でもオブジェクトでもない場合
}
}
return obj;
}
getNested(hoge, ['moge', 'poge', ...]);
便乗で質問なのですがtry catchでスルーしちゃだめなのですか
>>759 ありがとうございます
自分もほぼ同じ処理を今書いたところでした・・
例外は基本的に異常を目立つ方法で知らせるものなので
通常の範疇で発行するのは控えた方がいいと本に書いてありました
例外を投げるんじゃなくてエラーをそのままにしておくので少し違いましたね
>>761 プロパティアクセス演算子を ToBoolean で判定するより、in 演算子で判定する方が好ましいと思います
>>760,762
例外を放置することになるので、特殊なケースを除いて出来るだけ避けるべきです
通常は例外が発生しないようにコードを組みます
>>762,763,765
なるほど勉強になりました
ようはデバッグのときに使えということなのでしょうかね
>>766 デバッグで try-catch は使いませんよ。
例外を回避したら、エラー不明でむしろデバッグできなくなります。
デバッグするなら例外は発生させるべきです。
そもそも、例外とは意図的に発生させるものです。
TypeError なら特定の型以外の引数は受け付けないという事。
ならば、関数呼び出しする前に typeof 演算子で型判定を入れれば例外を回避できます。
多くの場合はこのように実行前に回避できますが、中には関数呼び出しするまで例外条件を判定できないケースがあり、その場合に try-catch を使用します。
広告を非表示にするアドオンに対抗するためのantiblockっていうのあるじゃないですか
これは広告を非表示にするアドオンを入れると
Please disable your なんちゃらってメッセージが出てページ内の表示をブロックされるんですが
このantiblockが生成する要素をconsoleから消してるんですが、消したらすぐにまたブロックの要素が表示されます
http://antiblock.org/?p=v3&demo これってどういう仕組みになっているのでしょうか?
>>768 要素の削除を検知する mutation event を利用しているっぽい
コードの中に
addEventListener("DOMNodeRemoved", ... )
がある
そのハンドラで削除された要素を再生成しているのだろう
まじすか
クソうぜえっすね
どうにもならなそうですね
今は降伏することにします
Chromeなら開発者ツールからコード直接編集できるだろ
エディターやらIDEやらってなに使ってます?
atom
>>770 削除ではなく、非表示にしてみてはどうでしょう?
775 :
747:2014/05/20(火) 17:22:52.51 ID:???
>>774 その手がありますね!ありがとうごじあます
>>771 ページを移動するたびに手動で編集するのは堪えますw
>>759 > if(obj instanceof Object){
これやって、一体何のメリットが有るんですか?
(注意 俺は無駄だと思ってる)
最後のelseがあるからじゃない
var xx=function(){}
ってする人はバカなんですか?
みにくいんですけど
>>788 あー、それは俺も思う。
必要な場合はそれでいいけど、
普通は、function xx() {} であるべきだよな。
どっちでもいいんでないの
後から変更することもあるから最初から
var xx=function(){}
にしとけば手間を省けるとか
エディタのシンタックス強調の設定を手抜きしたいとか
>>778 チェックしないと obj[name] がエラーになるやん
タイミングとはもっと詳しくおしえてください
ぐぐれかす
タイミングが違うのは判った上でだろ
タイミングが違う事がわかってるなら「バカなんですか?」とバカな発言はしないだろ
普通に考えるとタイミングが違うだけなら、var xx=function(){} と書くメリットがまったく感じられないんですがw
バカは言いすぎかもしれませんが、頭が悪いかなと思います
>>778 objがプリミティブ値(Number | String | Boolean Null | Undefined)
かどうかを判定してると読めばいいんじゃない?
function getNested(obj, names){
var v = obj[ names[0] ];
/* nameの最後、またはプリミティブ値に達するまでobjを探る */
for (var i = 1; i < names.length; i++) {
if (! v instanceof Object) break;
v = v[ names[i] ];
}
return v;
}
>>791 その程度のレスしかできないあなたもその程度
変数に代入してるならそれを何度か使うんだろ
一度しか使ってないなら、何度か使う可能性があるのかもしれない
>>789 どちらにしても小馬鹿にした態度は変わらないのね…
初めから結論が出ているなら質問しない方がいいと思うよ
通常は結論を保留するからこそ質問するものだけど、あなたの質問は逆に見えるからね
両者の違いを理解しない状態で一方を馬鹿と断ずるのは賢い選択とはいえないよね
795 :
745:2014/05/21(水) 02:14:18.04 ID:???
>>745 自己レス。漏れの勘違い
forEachは、順番に処理するんだね
for inが、順序不定だったか
結局
var a = function(){}
と
function a(){}
のそれぞれの使い分けを詳しく説明できる人いないの?
むしろ何が分からないのかが分からない
既に説明されてるし、これ以上詳しく説明しようとも思わない
あらたに判明した問題に対して
フラグを新設することで対応して
後から何やってるか分かりにくくなる現象の名前は何ですか?
場当たり対応
ぬるぽきゃんせらー
>>798 どのレスのことなのかレス番つけてください
クロージャって、関数が作成された後にも
その変数の内容はリアルタイムに追尾されるんですか?
関数を作成してクロージャにする
→元関数の中で変数を変更する
→作成した変更の中で渡された変数を参照する
変数の内容は?
作成された関数の中で、でした
(function (){
var a = 'hoge';
_.delay(function(){
console.log(a);
},60);
a = 'moge';
}());
とやったらリアルタイムに反映してました
>>796 違いを理解したからこそ「頭が悪い」と判断したんじゃなかったの?
関数の中で関数を作成することでしかクロージャは実現できないのでしょうか?
既に存在する関数に変数を封入することはできませんか?
>>808 具体的に何がしたいんだ?
よそから渡された関数の環境を書き換えたいとか?
>>808 その関数専用の大域変数を作りたいということなら
bind を使うのがいいんでないか
>>808 おかしな事を言っている
関数は定義した時点で使う変数が決まっている
後で追加するという事はその変数を使うコードはどうするんだ?
参照渡しして書き換えるみたいなことが簡便に出来ないかと思ったのです
>>813 それがオブジェクトだったら普通に引き数で渡して
プリミティブだったらインラインで配列を作成して引き数で渡すかね
>>813が何をしたいのかよく判らんが、こういう感じ?
function foo(name, age){
var data = {age: age};
function ret() {
console.log(name + ": " + data.age);
}
ret.data = data;
return ret;
}
var fn = foo("kikko", 17);
fn(); // kikko: 17
fn.data.age = 49;
fn(); // kikko: 49
var a = function(){}
変数に代入して、aで使うと、見にくいだけで、特に損がない
関数名で使うと、その度にインタプリタが、
関数が同じかどうかを確認したり、
ちょっとした書き間違いや引数の違いでも、
どう処理されるかわからない
JSは間違いでもエラーにならず、処理が進むため、
余計な間違いを避けたい
変数に代入して、aで使うと、見にくいだけで、特にメリットがない。
の間違いだな。
変数に代入して複数箇所でコールバックとして使うんだろ
はい論破
いつまでこの話題を引きずるんだろう
自己完結してるなら黙ってればいいのにね
指摘回答を待ってるのが透けて見える
別に変数に代入しなくても複数箇所でコールバックとして使えるんじゃないの?
そう言われればそうか
関数定義は関数定義より前のコードで使えるが
代入は代入してからでないと使えない
したがってスタティックな性質のものなら関数定義、
ダイナミックな性質のものなら代入がいい
はい論破
関数の定義のスコープは
・関数定義
・関数名に代入
だけですか?
window.a = function() {};
とかすれば関数定義とほぼ同じなのでしょうか
「関数の定義のスコープは関数定義」
「関数の定義のスコープは関数名に代入」
ってどういう意味?
>>824 もっと柔軟に文章を読む努力をしてください
>>825 なるほどすっきりしました
ありがとうございました
代入したほうがメモリが節約できるからね
それは違うんじゃ・・・
代入だと上書きされる危険がある
はい論破
function foo() {
console.log("I'm foo!");
}
var foo = function() {
console.log("I'm bar!");
}
foo(); // I'm bar!
関数定義だって上書きされるけどね。
function foo(){} は、
var foo = function(){} の構文糖と考えていい。
foo.nameに関数名が入ることを除いて違いはない。
foo = function hoge(){}
ってこともあり得るんだから少し違うんじゃ?
もう少し詳しく。
$(document)を関数の中で複数回使う時は別の変数に入れますか?入れませんか?
指定した文字列のテキストノードを持つ要素を探す方法があれば教えて下さい
例えば <div>ほげほげ</div> のような要素を探したいときに
現在はgetElementsByTagName('div')からforで子ノードを調べています
>>834 class属性つけるのアリなら
html
<div><div class="hoge">hogeほげほげhoge</div>
<span>ほげほげ</span>
<div>ほげほげ</div>
javascript
console.log($("div.hoge:contains('ほげほげ')"));
訂正
>>835 html
<div><div class="hoge">hogeほげほげhoge</div></div>
<span class="hoge">ほげほげ</span>
<div class="hoge">ほげほげ</div>
jqueryのdocument readyっていうやつはjavascriptでどうやるんですか?
window.addEventListenerでloadは違いますよね
>>826 いや、努力してもわからんから聞いている
「関数の定義のスコープ」の「スコープ」とは
何から何が見えていることを意味しているのだ?
「だけですか?」の「だけ」とはどのような制約を意味しているのだ?
そもそもわからなければ、答える・られる人がくるまで
もしくは、質問の補足があるまでスルーすればいい
それかエスパーして解答すればいい
>>834 文書の変更が許されない/変更したくないなら
NodeIterator か TreeWalker で1個ずつ探索するしかないか
TreeWalker の方が
テキストノード 1 個だけを含む
という条件で要素を探索できるので効率的に行える
巨大な文書で多量の検索がある場合はもっと効率的にやるために
インデックスを作成することになるだろう
>>841 エスパー回答ばかりで荒れた状況があることを考えると安易に同意できないかな
質問者もある程度の努力は必要かと
>>829 お前はロンパールームに行って二度と帰って来るな
文字をクリックする→その後別の場所をクリックする→その間の文字列が選択状態になる
という機能が、いろんなアプリに付いていますが、
chromeにもあります
それが想定外の部分で働いて文字が選択状態になることがあります
clickイベントをpreventDefaultしても防げないようです
どうすれば防げるでしょうか
http://jsbin.com/fajotupu/1/edit 文字列のどこかをクリックし、その後シフトキーを押しながら別の場所をクリックすると
その間の文字列が選択されるとい機能が
色々なアプリにあります
これがchromeで想定していないところで発動して困っています
クリックイベントでpreventDefaultしても止まらないようです
JSでは止めることは出来ないのでしょうか?
janeが変で連投になってしまいました
というか、書き込みが一部消えたような??
なにこれ
レスがごっそり無くなってるぞ
どこが消えてるの?全部表示されてますよ
>845以降のレスが消えてるね
新スレも一部消えていたけど、板移転の影響かな
Web制作板全体で5/23 0:00〜14:00(最低14:00、あるいは15:00)のログがなくなってるね。
移転するならメンテ中にして書き込みをロックすればよかったのに
まぁログ速でもscでもどこでも見れるさ
>>846 この機能ですが、ほとんどのアプリがそうなるので
windows自体の機能かもしれません
質問です
システムが勝手に吐き出すhtml 「A」がありますがこれにcssとjavascriptで装飾と動きを与えたいと思っています
そこで「B」のhtmlファイルに、このシステムが吐き出すファイル「A」から.loadで読み込んだhtmlを
表示させたところ、「B」のヘッダに記述したcssを適用させることができました
が、「B」のファイルに記述したjavascriptが動きません。
.loadで読み込んだhtmlに対してjavascriptで効果を与えることは出来ないのでしょうか?
もし出来るのであればどのような方法がありますか?
firefoxでも選択されますね
preventDefaultしているのに選択されるのが奇妙ですが・・
ぶっちゃけ疑問に思っている方が不思議だわw
>>857 パソコン歴とか年とかどれくらい何?
普段何やってる人?
>>858 しょうもない煽りですね
あなたよりは経験あると思いますよ
デフォルト動作を無効にしているのに選択される合理的な理由を
万が一言えるのなら言ってみてくださいね
ちなみにcssでuser-select: none;を指定すれば選択されないようにできるという目処は立ちました
ですが、やはりpreventDefaultしているのに文字列選択されるのはクソだと思うし、許しません
mousedownをpreventすれば選択されないと判明しましたので許します
>>856 読み込む順序は?
ちゃんと、Aを読み込んだ後に、JSを実行している?
コピペを防ぎたいのか知らんがソースを表示すれば簡単にコピペは可能
>>840 > これがchromeで想定していないところで発動して困っています
発動条件が書いてないので答えようがない、が正直な答え
そもそも、Googleに報告はしてるんだろうね
コピペを防ぎたいのではなく、アプリを操作中に選択状態になるのが困るということです
マウスカーソルを動かさないまま変更する汎用的な方法はありますか?
自分が見つけたのはカーソル直下の透明要素のcursorを変更し、
数百ms待ってから透明要素を消すことで出来るのですが
ディレイを入れず変更直後に透明要素を消すと変わりません(chrome)
このディレイの値が環境依存っぽくて気になります
ディレイを入れずに変更できる方法はないでしょうか?
リフローを発生させたらすぐに反映させることができましたo(^▽^)o
localstorageのsetItemの第一引数に変数は使えますか?
localstorageで使える残り容量ってどうやれば知れますか?
>>871 残りの利用可能容量は Quota Management API を使ってプログラム上で取得することができます。
最新chromeでwindow.webkitNotificationsが使えなくなってるね
くそが
http://jsbin.com/gucikube/1/edit notificationsのテストをしようとしてもエラーになるので
console.log(chrome.notifications);
とやったところundefinedと言われます
オブジェクト自体がないなら動くわけありません
chrome.notificationsはchrome28から使えるようになったようですが、
また使えなくなったのでしょうか?
キー入力の状態を明示的に「bodyをクリックした時と同じような状態」にするにはどうしたらいいでしょうか?
chromeで、contenteditableな領域でIMEオンのまま他のbuttonをクリックすると、
フォーカスは外れるのですが、そのままキー入力をすると、
contenteditable領域にキー入力が送られてしまいます
buttonではなくbodyなどをクリックすることでblurした場合は、そのようなことはありません
バグだと思いますが、buttonクリックでは「半blur」のような状態になるのです
なので完全にblurしたいのですが、スクリプトにより要素でblurを発行しても、完全blurにはなりません
完ブラするにはどうしたらいいでしょうか
はっと思いつき、
input textにフォーカスを移し、すぐにblurする、
というウルテクで完ブラすることが出来ました\(^o^)/
contenteditableという十分に枯れてないコンポーネントでのみ起きる現象だったので。
>>872 そういうものがあったのですね
調べてみます
ありがとうございました
880 :
Name_Not_Found:2014/05/26(月) 11:55:57.10 ID:mCA2gxiP
>>822-
わすれちゃいけないのが関数定義はブロックスコープだということ
>>875 それは拡張用であって特別なパーミッションが必要
標準APIは
new Notification('title', {body: 'body'})
これもパーミッションが必要
> わすれちゃいけないのが関数定義はブロックスコープだということ
それがどうかしたの?
変数もブロックスコープじゃん
いや、全て関数スコープだと思うが…
ブロックスコープはES6になるまで存在しない
だよな
テキストをスマホでタップした時に選択状態にしたいんですが、
<input type="text" ontouchstart="this.select();">
↑このように書いても選択されません。
何かアドバイスくださいお願いします。
ontouchstart を click にする。
>>883 ブロック中の関数宣言はES5までは仕様外でブラウザの独自実装
ブロックスコープか関数スコープかはブラウザによる
例えばChromeはブロックスコープ、Firefoxは関数スコープ
ただしES6ではブロックスコープになったのでこれからはそれに統一される
またそれに先立ってES5のstrict modeでは明示的に禁止されてる
あとES5まででもtry-catch(e)のcatch節中のeはブロックスコープになる
function test() {
var F = function () { return 'OK' }
if (true) { function F() { return 'NG' } }
return F
}
test()()
>>887 ブラウザの独自拡張を当然の動作であるかのように「関数定義はブロックスコープ」や「変数もブロックスコープ」と主張するのは違うと思ったのでES5仕様に則り、「全て関数スコープ」とした
「ES5では」と書かなかったのは反省してる
ところで、「ES6ではブロックスコープになった」のは知らなかった
まともな実装ならブロック内で関数宣言しないと思うが、コードによっては大きな影響がありそうだな
>>887 だからなんなんだよ?
ブロックスコープで関数宣言するってはない誰もしてないだろ。
関数スコープで関数宣言するのなら、
動的なものでもない限り、静的に関数宣言、つまり
var func = function () {・・・} よりも
function func() {・・・} の方がふさわしいって話を
みんなしてるんだが。
function文とfunction式の違い、式である必要がないなら
function文を使いましょう。
ん? まさか { }でくくられたものは全て
ブロックコープだって思ってないか?
function foo() {
function bar() {・・・} // ← ここはブロックスコープではない。
if (・・・) {
// こことかがブロックスコープ
}
}
うーん、なんか主張が噛み合ってないね。関数スコープってのは逆に言えばブロック中に書いても滲み出るものであって、
そもそもブロック中に置けないのなら関数だってブロックなんだから、むしろブロックスコープだという方が一般的な言葉の印象として正しいと思うけどな。
まあそれはブロックスコープより関数スコープが「基本」だと思ってるからだろう。そこが咬み合わない原因かもしれない。
ブロックスコープが「基本」で関数スコープが第二の面白いスコープだと思えば、関数直下にしかない状況でわざわざ関数スコープを優先的に先に考えるのは変だと気付く
ES6からはブロックスコープだがES5までは関数スコープだったとわざわざ言うとまるでブロック文中に書いたときの挙動が変わったように思える。
だが実際の実装ではまさにそうなってるんだから、むしろ関数スコープだったと言えるのは、ES5というより実際の実装の方ではないだろうか?
892 :
883,888:2014/05/26(月) 20:00:04.53 ID:AQkGHY9b
何を怒っているのかわからんが、俺は参考になったので
>>887には感謝してる
ここは質問者の答えは出るけど
その後よくわからんJavascript勉強会が始まる
894 :
883,888:2014/05/26(月) 20:12:09.21 ID:AQkGHY9b
>>891 文脈からすると俺に対するレスであってるだろうか
出来れば、レスアンカーを付けてくれるとありがたい
(一応いっておくが、>889-890は俺じゃない)
> ES6からはブロックスコープだがES5までは関数スコープだったとわざわざ言うとまるでブロック文中に書いたときの挙動が変わったように思える。
そのように理解してる
あなたが主張する ES6 のブロックスコープは残念ながら裏が取れていないのだが、
ES5 では try-catch を除いて関数スコープなので
>>837では "OK" が返り、ES6では "NG" になるはず
事実、Google Chrome 34 では "NG" が返る
>>891 お前が馬鹿なだけじゃね?
そもそも関数スコープとブロックスコープの違いを知らなかっただろ?
それを無理やり「俺は知ってた」みたいにこじつけるのやめとけよ。
>>891 お前何いってんの? ECMAScriptの仕様調べないで、自分の定義から
仕様を推測するとかアホなことやってんの? お前の印象なんかどうでもよくて、
ブロックスコープと関数スコープのどちらが基本とか関係なくて、
単に仕様では「ES5までは関数スコープしか存在しなかった」という事実でしか無いだろ。
実装がどうとかそんなの関係なく関数スコープしかなかったの。それがECMASCriptの一般的な言葉。
で関数定義はブロックスコープで行った場合の挙動は実装依存だが、
関数スコープで行った場合の挙動は明確で使用することに何の問題もない。
ES5において、スコープは
グローバルスコープ と 関数スコープしか無い。
関数の中にあるものは関数スコープで、そうでないものはグローバルスコープ
ES6では新たにブロックスコープができた。
ブロックスコープとは関数スコープの中でブロックを作った時に出来るスコープで、
そのスコープ内でのみ存在する変数はletを使って定義する。
letを使わない限り変数は関数スコープとなり、ブロックスコープはオプションと考えられる。
>>898 >ブロックスコープとは関数スコープの中でブロックを作った時に出来るスコープ
グローバルスコープの中では、ブロックスコープはできないってこと?
ES6でスコープのデフォルトがブロックスコープに変わったとか
そういうことが起きたわけじゃない。
従来通りのコードを書けばES5のとおり関数スコープ(関数の中でなければグローバルスコープ)
それが互換性というものなのだから当然。
そこに新たにブロックスコープという概念が追加された。だがそれは追加機能であり
letを使わないとそのスコープは利用されない。
>>899 めんどくせぇやつだな。
関数直下以外はブロックスコープだよ。
関数スコープはなくなったわけじゃないし、
letを使わない限り、関数スコープ。
ES5では関数スコープしかなくて、
ES6で新たにブロックスコープという概念が追加されたの。
>>902 はいそうです。
関数定義はブロックでやってはいけません。
そもそも、動的に定義する必要がないものは静的に定義するのが良いコードなので、
関数定義は(必要がない限り)function文で行うものです。function式で行うべきじゃありません。
ifなどのブロックは実行時に処理されるかどうか決まるので本質的に動的です。
だから静的に行うべき関数定義は、静的に、ゆえに関数スコープでやるべきなのです。
904 :
887:2014/05/26(月) 20:48:41.12 ID:???
>>889-890 変数がどんなスコープになるかは場所で決まるんじゃなく、宣言によって決まってる
「ここは〜スコープ」という言い方はない。「この宣言だと〜スコープ」となる
結果的にスコープがどうなるかで、このケースは〜スコープと言ってるわけではなく
この宣言はどんなスコープになる種類なのかを話している
>>891 確かに同じことの言い回しの問題かもしれない
>>894 びっくりして試してみたが初期設定のCh35(現在の安定版)では"OK"が帰った
そしてES6なら(ブロックスコープ)なら"OK"が帰る
すまないが返信はまた明日の朝する
905 :
902:2014/05/26(月) 20:53:45.60 ID:???
いや、スコープは場所で決まるんだよ。
ただし、ブロックスコープで有効な変数は
letを使うってだけ。
letを使った所がブロックスコープになるのではない。
>>905 > 私はif文内で関数を生成するなら
いや、そういう区別の仕方はおかしいでしょw
動的に関数を生成するかどうかで決めるのが正しい。
動的に関数を定義するのは、定義するタイミングが動的になってしまう。
これは静的に決まることよりもコードのメンテナンス性という意味で
悪くなってる。
>>905 > あと、細かいことで恐縮ですが、あなたの仰る「関数定義」は「関数宣言」ではないでしょうか
宣言と定義が明確に区別されているのは、
C言語ぐらいなので、それはどうでもいいこと。
おまえらいいかげん他でやれよ
真面目な会話と横槍の温度差が激しい
無名関数を直接引数にするとき以外で
ifの中で関数を生成するってあまりないなぁ。
仕様の話と主観的な意見が入り混じっていて何だかなあ
仕様の話なら、仕様見れで終わるわけで、
掲示板を使う理由がないんだがw
画像を読み込むときに何%読み込み完了したか表示してるサイトとかたまにみますけど
あれはどうやってるんですか?
しかし代替手段のないletを平気で使えるようになるのは3年は待たないと駄目だろうね
>>914 XMLHttpRequest progressイベント でggr
変数のスコープなんて考えを使ってるから、
セキュリティホールを作り込むんだよ。
全部グローバルにすればいい。
昔の堅牢なシステムは全部それで上手くいってた。
918 :
Name_Not_Found:2014/05/27(火) 02:35:27.41 ID:DGzKVkqL
すみません、質問です
iframeに別ドメインのページを読み込ませると、その中で動いているjqueryがエラーを頻発し
IE8でjs警告メッセージがでてきます
(例えば、$(div).〜と書いてるのがエラーになり、jQuery(div).〜に書き直したら収まるような妙なエラー)
しかし、同じページをiframeでなく直接開くとそのエラーは出ないという状況です
これは何が原因でしょうか
iframeで開く時に何か気をつけないといけないことがあるんでしょうか
lodashで単純なforループをするにはどうしたらいいんですか?
前の方でfunctionの問題が出ていますが
コンストラクタ定義をfunctionでして、そのprototype定義をその後ろでしていたとします
コンストラクタの前でnewしたら、
既にfunctionは定義されているのでインスタンスは生成できますが、
プロトタイプは設定されていないのでおかしくなります
function定義と同じタイミングでプロトタイプも定義する方法はありますか?
コンストラクタだけが出来て変になるのを防ぐために
function定義はやめた方がいいってことですよね?
はい論破
変になるのを防ぐってwwwww
せめて日本語を勉強してから論破しろよ
じゃあお前不完全なオブジェクト出来ていいのかよ