のくす牧場
コンテンツ
牧場内検索
カウンタ
総計:127,432,613人
昨日:no data人
今日:
最近の注目
人気の最安値情報

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

JavaScript覧 / PC版 /
スレッド評価: スレッド評価について
みんなの評価 :
タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。
←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitter
802 = :

var o = {
a: 1,
b: 2,
c: 3
};

for ( var key in o ){
delete(o[key]);
console.log(key+' deleted');
console.log(o);
}

こういう風に、ループの中でオブジェクトのメンバを削除しても問題はないようですが
すべてのJavaScriptエンジンで安全なのでしょうか?
ループ中で削除しているのに内部カウンタが変にならないのは何故ですか?

804 = :

と思ったけどループの中で一度にメンバを削除するとループ回数は減る
どんな実装だこれ

806 = :

ループ処理のなかで関数を呼び出すとき
外にその関数を変数に入れておくといいと聞いてやってみたのですが
エラーが出るものと出ないものがありますこの違いはなんでしょうか?

807 = :

内部的にはイテレータが呼ばれてる
このイテレータはあんまり厳密に定義されてないは

ただ形としては、最初にキー一覧のリストを保持して、
その最初を列挙し、列挙する度(や列挙中の削除で)消していく形と思われるそうだ

途中で追加されたものは列挙しなくていいし、削除されたは多分列挙されないだろう程度にしか書いてない

つまり早い話実装依存です

808 = :

ありがとうございます
自分でキーを取得してそれをループした方がよさそうですね

810 = :

>>806
関数の中でthisが使われているのでは

811 = :

canvasをfuncution aの中でgetContextしてfunction bの中でcanvasを使う時もう一度
getContextしなければいけないですかね
前処理みたいな感じで一回やるだけにしたいんですが

812 = :

両関数の外側でgetContextするのではダメなの?

813 = :

>>810
まさにそれでした

815 = :

>>814

<script>//<![CDATA[

/* 2009/08/05, 2010/03/03
・Canvasサンプル
Firefox 3.5以上。 3.0は不可
Opera 10.5以上。10.1は不可
*/

var c;

function draw() {
c.fillText("fillText デフォルトフォント あういえお", 10, 20);
}

function init() {
/* canvas要素のノードオブジェクト */

/* 四角を描く */
var canvas = document.getElementById("canvas1");
c = canvas.getContext("2d");
}
//]]></script>
</head>
<body onload="init()">
<canvas id="canvas1" width="300" height="300"></canvas>
<input type="button" value="init" onclick="draw()">

816 = :

そりゃ動くわけねえよ
最初のグローバルcanvasはdom要素がまだできてないから空だし
initの中でvarしたらそれはローカルだし
(htmlの方のdrawのとこは書き間違いだよね?)

<head>
<script>
var canvas;
var c;

function draw() {
c.fillText("fillText デフォルトフォント あういえお", 10, 20);
}

function init() {
canvas = document.getElementById("canvas1");
c = canvas.getContext("2d");
}
</script>
</head>
<body onload="init()">
<canvas id="canvas1" width="300" height="300"></canvas>
<input type="button" value="draw" onclick="draw()">

817 = :

おっとかぶった

818 = :

>>808
オブジェクトから特定のキーを削除したいって話だよね?

var _ = require('lodash');
console.log(_.omit({ a: 1, b: 2, c: 3, d: 4 }, ['b', 'd']));
{ a: 1, c: 3 }

もし、なにか処理してから消したいっていうのであれば、
_.omitの第二引数にクロージャ使える。
_.omit({ a: 1, b: 2, c: 3, d: 4 }, function(value, name) {・・・})

819 = :

>>815
>>816
できたー
ありがとうございます!!

820 = :

CDATAってもう削除されたんじゃないの?

821 = :

初耳

822 = :

これを隠蔽する場合はどうするんだろ、初級者だからあまりよくわかっていない

<head>
<style>#canvas1{border:1px solid black;}</style>
<script>
window.onload=function(){
var canvas = document.getElementById("canvas1");
var c = canvas.getContext("2d");

var draw1=function(){c.fillText("あいうえお", 10, 20);};
var draw2=function(){c.fillText("かきくけこ", 20, 40);};

document.getElementById("bt1").addEventListener('click',draw1,false);
document.getElementById("bt2").addEventListener('click',draw2,false);
};
</script>
</head>
<body>
<canvas id="canvas1" width="300" height="300"></canvas>
<input type="button" value="draw1" id="bt1">
<input type="button" value="draw2" id="bt2">
</body>

823 = :

>>795
C/C++のCならTCC(Tiny C Compiler)だとzip展開するだけで環境揃うし、
「tcc -run ソースコード」で実行ファイル作らずに直接実行も出来る。
ただのCだからVCでもgccでもclang/llvmでも動くコードとかも書ける。
Windows限定だがWSHはインストール不要だろうし、
C#/JScript.NET/VB.NETもコンソール版コンパイラは.NET入ってれば勝手に入ってる筈。

GUIまで考えるとWebブラウザでJavaScriptが手軽なのは否定しないがな。

824 = :

>>822のJavaScript部分を単純にjQueryを使うだけでこうなる

$(function(){
 var canvas = $("#canvas1")[0];
 var c = canvas.getContext("2d");

 var draw1=function(){c.fillText("あいうえお", 10, 20);};
 var draw2=function(){c.fillText("かきくけこ", 20, 40);};

 $(#"bt1").on('click',draw1);
 $("#bt2").on('click',draw2);
});

俺ならこう書く。

$(function(){
 var canvas = $("#canvas1")[0];
 var c = canvas.getContext("2d");

 $(#"bt1").on('click', function() {
  c.fillText("あいうえお", 10, 20);
 });

 $("#bt2").on('click', function() {
  c.fillText("かきくけこ", 20, 40);
 });
});

826 = :

>>825
まずね、hogehogeに入っているのが県名というのがおかしいよ。
普通はキーでなければいけない。
たとえば"県"という文字を省略したいと思ったら大変でしょ?
文字列は人間用もの、内部的にはキーで扱うのが定石。
文字列で入力されたのなら、処理の前にキーに置き換えれば良い。

で、どうしてもhogehogeが文字列でなければならないという話をしてもいいけどさ、
まずさ、そのコード動かないよね? セレクタを使わない以前の話なんだけど。
動かないからセレクタを使わないで書きたいというのならだめ。
まずそのコードを動くようにしなさい。

827 = :

まだ? どうせみてないだろうけど。

> hogehogeに入っている都道府県名と一致すれば、都道府県が最初から選択されてるいるようにしたいです。

ちゃんと動くように書いたコードはこれ。

var hogehoge = '青森県';
$("select[name='todofuken'] option:contains(" + hogehoge + ")").prop('selected', true);

で、聞きたいんだけど、何のためにこれをセレクタを使わずに書き直したいの?

828 = :

<script>
function xxx() {
document.getElementById('xxx').innerHTML = '開始';
//適当な処理
var start = new Date(); for(;;) {var time = new Date() - start; if(time > 5000) {break;}}
document.getElementById('xxx').innerHTML = '処理中';
//適当な処理
var start = new Date(); for(;;) {var time = new Date() - start; if(time > 5000) {break;}}
document.getElementById('xxx').innerHTML = '終了';
}
</script>
<div id="xxx">ここに進捗を表示</div>
<button onClick="xxx()">処理開始</button>

getElementByIdによる書き換えで処理中の進捗を表示をさせたいと思っているのですが
開始→処理中→終了の順で表示されず全ての処理完了後に終了だけが出て来ます
開始→処理中→終了の順で表示させるにはどうすればよいのでしょうか?
書き換えが行われた後に次の処理に行くと思っていたのですが・・・

829 = :

>>828
描画のタイミング

<script>
function xxx() {
document.getElementById('xxx').innerHTML = '開始';
//適当な処理
setTimeout(function() {
document.getElementById('xxx').innerHTML = '処理中';
//適当な処理
setTimeout(function() {
document.getElementById('xxx').innerHTML = '終了';
}, 5000);
}, 5000);
}
</script>
<div id="xxx">ここに進捗を表示</div>
<button onClick="xxx()">処理開始</button>

830 = :

>>828
「JavaScript innerHtml 描画」あたりでググると理解できると思うよ
簡単に言うと、処理は行われてるけど画面の再描画がされないため

831 = :

>>829-830
処理完了と描画完了はタイミングが違うのですね
ありがとうございます、助かりましたm(__)m

832 = :

変数宣言についてなんですが
関数内で一回しか登場しないのを変数に入れるのは無意味なんですか?

833 = :

>>832
いいえ、無意味とは限りません。
それは説明用変数って呼ばれるものです。

http://hamasyou.com/archives/000199#説明用変数の導入
> 長くて、よく考えないとわからないような評価式があった場合、
> 一時変数を使って意味のわかるようにする。条件ロジックにおいて、
> 各条件記述の意味を適切な名前の一時変数を使って説明するのは有効です。
> ただし、メソッドの抽出を行える場合は、そちらを優先する。
> メソッドにすることで他の場所でも使える可能性ができる。

834 = :

こっちのほうが具体的だった。

http://d.hatena.ne.jp/asakichy/20100615/1276562541

どんなとき? 複雑な式がある。
どうすれば? 処理の目的を説明するような名前を持つ一時変数に式、または式の一部の結果を代入する。

どうして?
式は複雑になって読みにくくなることがあります。一時変数を使うと、式を管理しやすい形に分解できます。
条件分岐のコードで特に役に立ちます。個々の条件節の意味を、適切な名前の一時変数で説明することができます。
長いアルゴリズムでも役に立ちます。長い計算に含まれる1つ1つのステップを一時変数で説明すればコードがわかりやすくなります。

どうやって?
一時変数にはデメリットもあります。余分な一時変数はコードを読む人の注意をそらし、
コードの理解を妨げます。1つのメソッドでしか使えないため、メソッドを長くする原因にもなります。
よって、「説明用変数の導入」よりも、「メソッドの抽出(Extract Method)」を優先すべきです。
メソッドならオブジェクト全体、スコープによっては他のオブジェクトから使用することもできます。
ただ、「メソッドの抽出」は他のローカル変数があると困難になることがあるので、その場合に「説明用変数の導入」を使用します。

835 = :

なるほど説明用変数とは初めて聞きました
そういう用途もあったんですね

836 = :

switch文の条件式で文字列がある場合を表現するには
どう書けばいいんですか?
if (hoge !== "") を表したいということです

837 = :

>>836
どう考えてもif文が適切ですが、なぜswitch文なんです?
String型であることを保証してあればやりようはありますが、それならそこの一文でif文使ったほうが最良。

838 = :

chromeでシフトを押しながらマウスホイールを回すと、縦方向にまわしても横方向になることを発見しました
firefoxではそうならないのでchromeだけだと思います
これをJSレベルでやめさせることはできますか?

839 = :

>>838
とても迷惑な仕組みを考えてるね…

840 = :

本当に迷惑です
chromeはたまにこういういらぬお節介がある気が

841 = :

>>840
日本語通じない人?
Chromeの機能を無効化する考えが迷惑

842 = :

は?馬鹿かお前
ウェブアプリはもはやネイティブアプリに近くなっているのだからシフトキーも普通に使われるのだよ
勝手にホイールマウスの軸を変えるのは迷惑でしかない
迷惑行為を無効化することを迷惑とは言わない。
そもそもシフトキーを押した時に軸を入れ替えるならまだマシだが
縦方向を横方向にし、横方向はそのままだから
シフトキーを押していたら横方向にしかスクロールできない
これをクソ設計と言わずして何と言おうか。
まぁgoogleというブランド価値にファーっとなって思考停止するD級プログラマーには分からないだろうけど

843 = :

縦方向にしかホイールスクロールできない環境のために付けたのだろうが
今時そんなプア環境にデフォルトで対応すべきではない
対応したければオプションを付けることだ
まぁそんなオプションほとんど誰も使わないだろうが

844 = :

>>842
そういう機能は拡張で実装しろよ
おまえが不便だと思っている機能が便利だと思う奴がいるかもしれないだろうが

845 = :

そもそもブラウザの機能をWeb制作側で何とかしようと思う発想がおかしい

846 = :

>>844
何言ってるか分からん
>>845
ブラウザかアホなんだから仕方ない
フォロー出来るならするけど多分出来ないだろうなぁ
googleは代替機能にスイッチ出来るようには作らないから。
まぁまぁ賢いけど最高に賢いわけではないやつ特有の傲慢さがある

847 = :

>>846
お前の勝手な思想を訪問者に押し付けるなって事だよ
考え方は多種多様なんだからUIを押し付けてユーザの行動を制限すべきじゃない
やるなら、拡張にしてユーザに選択の自由を与えるべき

848 = :

というか、自分が不便だと思うなら自分の環境を変えればいいだけだろ
何で皆を同じ環境にしようとしてるんだよ

849 = :

> まぁgoogleというブランド価値にファーっとなって思考停止するD級プログラマーには分からないだろうけど
いつものD級プログラマー君か
アクセシビリティも知らないんだな

850 = :

>>847
馬鹿?
これはユーザーが望んだ機能じゃない
googleが勝手に付けた機能だ
こんな機能は存在すらほとんど知られていないだろうな


←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / JavaScript一覧へ
スレッド評価: スレッド評価について
みんなの評価 :
タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

類似してるかもしれないスレッド


トップメニューへ / →のくす牧場書庫について