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

このエントリーをはてなブックマークに追加
874Name_Not_Found:2014/05/25(日) 05:14:31.10 ID:???
https://developer.chrome.com/extensions/notifications
Internal server error

サーバもろくに管理できねーのか
875Name_Not_Found:2014/05/25(日) 05:34:41.69 ID:???
http://jsbin.com/gucikube/1/edit
notificationsのテストをしようとしてもエラーになるので
console.log(chrome.notifications);
とやったところundefinedと言われます
オブジェクト自体がないなら動くわけありません
chrome.notificationsはchrome28から使えるようになったようですが、
また使えなくなったのでしょうか?
876Name_Not_Found:2014/05/25(日) 09:50:54.90 ID:???
>>859
と言うことは、ただのアホか
877Name_Not_Found:2014/05/25(日) 16:15:46.95 ID:???
キー入力の状態を明示的に「bodyをクリックした時と同じような状態」にするにはどうしたらいいでしょうか?
chromeで、contenteditableな領域でIMEオンのまま他のbuttonをクリックすると、
フォーカスは外れるのですが、そのままキー入力をすると、
contenteditable領域にキー入力が送られてしまいます
buttonではなくbodyなどをクリックすることでblurした場合は、そのようなことはありません
バグだと思いますが、buttonクリックでは「半blur」のような状態になるのです
なので完全にblurしたいのですが、スクリプトにより要素でblurを発行しても、完全blurにはなりません
完ブラするにはどうしたらいいでしょうか
878Name_Not_Found:2014/05/25(日) 16:26:24.74 ID:???
はっと思いつき、
input textにフォーカスを移し、すぐにblurする、
というウルテクで完ブラすることが出来ました\(^o^)/
contenteditableという十分に枯れてないコンポーネントでのみ起きる現象だったので。
879Name_Not_Found:2014/05/26(月) 04:10:53.13 ID:???
>>872
そういうものがあったのですね
調べてみます
ありがとうございました
880Name_Not_Found:2014/05/26(月) 11:55:57.10 ID:mCA2gxiP
>>822-
わすれちゃいけないのが関数定義はブロックスコープだということ

>>875
それは拡張用であって特別なパーミッションが必要
標準APIは
new Notification('title', {body: 'body'})
これもパーミッションが必要
881Name_Not_Found:2014/05/26(月) 12:47:07.25 ID:???
> わすれちゃいけないのが関数定義はブロックスコープだということ
それがどうかしたの?
882Name_Not_Found:2014/05/26(月) 13:16:42.37 ID:???
変数もブロックスコープじゃん
883Name_Not_Found:2014/05/26(月) 14:10:23.44 ID:???
いや、全て関数スコープだと思うが…
ブロックスコープはES6になるまで存在しない
884Name_Not_Found:2014/05/26(月) 14:16:23.31 ID:???
だよな
885Name_Not_Found:2014/05/26(月) 15:46:05.85 ID:???
テキストをスマホでタップした時に選択状態にしたいんですが、

<input type="text" ontouchstart="this.select();">


↑このように書いても選択されません。
何かアドバイスくださいお願いします。
886Name_Not_Found:2014/05/26(月) 16:57:15.21 ID:???
ontouchstart を click にする。
887Name_Not_Found:2014/05/26(月) 18:28:44.95 ID:???
>>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()()
888Name_Not_Found:2014/05/26(月) 19:36:43.17 ID:???
>>887
ブラウザの独自拡張を当然の動作であるかのように「関数定義はブロックスコープ」や「変数もブロックスコープ」と主張するのは違うと思ったのでES5仕様に則り、「全て関数スコープ」とした
「ES5では」と書かなかったのは反省してる

ところで、「ES6ではブロックスコープになった」のは知らなかった
まともな実装ならブロック内で関数宣言しないと思うが、コードによっては大きな影響がありそうだな
889Name_Not_Found:2014/05/26(月) 19:45:04.77 ID:???
>>887
だからなんなんだよ?

ブロックスコープで関数宣言するってはない誰もしてないだろ。

関数スコープで関数宣言するのなら、
動的なものでもない限り、静的に関数宣言、つまり
var func = function () {・・・} よりも
function func() {・・・} の方がふさわしいって話を
みんなしてるんだが。

function文とfunction式の違い、式である必要がないなら
function文を使いましょう。
890Name_Not_Found:2014/05/26(月) 19:47:42.40 ID:???
ん? まさか { }でくくられたものは全て
ブロックコープだって思ってないか?


function foo() {
 function bar() {・・・} // ← ここはブロックスコープではない。

 if (・・・) {
  // こことかがブロックスコープ
 }
}
891Name_Not_Found:2014/05/26(月) 19:56:45.54 ID:???
うーん、なんか主張が噛み合ってないね。関数スコープってのは逆に言えばブロック中に書いても滲み出るものであって、
そもそもブロック中に置けないのなら関数だってブロックなんだから、むしろブロックスコープだという方が一般的な言葉の印象として正しいと思うけどな。

まあそれはブロックスコープより関数スコープが「基本」だと思ってるからだろう。そこが咬み合わない原因かもしれない。
ブロックスコープが「基本」で関数スコープが第二の面白いスコープだと思えば、関数直下にしかない状況でわざわざ関数スコープを優先的に先に考えるのは変だと気付く

ES6からはブロックスコープだがES5までは関数スコープだったとわざわざ言うとまるでブロック文中に書いたときの挙動が変わったように思える。
だが実際の実装ではまさにそうなってるんだから、むしろ関数スコープだったと言えるのは、ES5というより実際の実装の方ではないだろうか?
892883,888:2014/05/26(月) 20:00:04.53 ID:AQkGHY9b
何を怒っているのかわからんが、俺は参考になったので>>887には感謝してる
893Name_Not_Found:2014/05/26(月) 20:01:48.87 ID:???
ここは質問者の答えは出るけど
その後よくわからんJavascript勉強会が始まる
894883,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" が返る
895Name_Not_Found:2014/05/26(月) 20:14:18.98 ID:???
>>891
お前が馬鹿なだけじゃね?

そもそも関数スコープとブロックスコープの違いを知らなかっただろ?
それを無理やり「俺は知ってた」みたいにこじつけるのやめとけよ。
896Name_Not_Found:2014/05/26(月) 20:21:37.09 ID:???
897Name_Not_Found:2014/05/26(月) 20:24:21.76 ID:???
>>891
お前何いってんの? ECMAScriptの仕様調べないで、自分の定義から
仕様を推測するとかアホなことやってんの? お前の印象なんかどうでもよくて、
ブロックスコープと関数スコープのどちらが基本とか関係なくて、

単に仕様では「ES5までは関数スコープしか存在しなかった」という事実でしか無いだろ。
実装がどうとかそんなの関係なく関数スコープしかなかったの。それがECMASCriptの一般的な言葉。

で関数定義はブロックスコープで行った場合の挙動は実装依存だが、
関数スコープで行った場合の挙動は明確で使用することに何の問題もない。
898Name_Not_Found:2014/05/26(月) 20:28:44.42 ID:???
ES5において、スコープは
グローバルスコープ と 関数スコープしか無い。
関数の中にあるものは関数スコープで、そうでないものはグローバルスコープ

ES6では新たにブロックスコープができた。
ブロックスコープとは関数スコープの中でブロックを作った時に出来るスコープで、
そのスコープ内でのみ存在する変数はletを使って定義する。
letを使わない限り変数は関数スコープとなり、ブロックスコープはオプションと考えられる。
899Name_Not_Found:2014/05/26(月) 20:33:03.85 ID:???
>>898
>ブロックスコープとは関数スコープの中でブロックを作った時に出来るスコープ

グローバルスコープの中では、ブロックスコープはできないってこと?
900Name_Not_Found:2014/05/26(月) 20:33:15.39 ID:???
ES6でスコープのデフォルトがブロックスコープに変わったとか
そういうことが起きたわけじゃない。

従来通りのコードを書けばES5のとおり関数スコープ(関数の中でなければグローバルスコープ)
それが互換性というものなのだから当然。

そこに新たにブロックスコープという概念が追加された。だがそれは追加機能であり
letを使わないとそのスコープは利用されない。
901Name_Not_Found:2014/05/26(月) 20:34:57.29 ID:???
>>899
めんどくせぇやつだな。
関数直下以外はブロックスコープだよ。

関数スコープはなくなったわけじゃないし、
letを使わない限り、関数スコープ。

ES5では関数スコープしかなくて、
ES6で新たにブロックスコープという概念が追加されたの。
902Name_Not_Found:2014/05/26(月) 20:37:58.19 ID:???
>>898
> letを使わない限り変数は関数スコープとなり、ブロックスコープはオプションと考えられる。
お手すきであれば教えて頂きたいのですが、>>887の「if文内での関数宣言がブロックスコープ」はES6にはない仕様で合ってるでしょうか
http://people.mozilla.org/~jorendorff/es6-draft.html から該当仕様を探そうとしていますが、見つけることが出来ず
自分の読解力がないだけなのか、本当に存在しないのか判断出来ませんでした
903Name_Not_Found:2014/05/26(月) 20:41:59.11 ID:???
>>902
はいそうです。

関数定義はブロックでやってはいけません。

そもそも、動的に定義する必要がないものは静的に定義するのが良いコードなので、
関数定義は(必要がない限り)function文で行うものです。function式で行うべきじゃありません。

ifなどのブロックは実行時に処理されるかどうか決まるので本質的に動的です。
だから静的に行うべき関数定義は、静的に、ゆえに関数スコープでやるべきなのです。
904887:2014/05/26(月) 20:48:41.12 ID:???
>>889-890
変数がどんなスコープになるかは場所で決まるんじゃなく、宣言によって決まってる
「ここは〜スコープ」という言い方はない。「この宣言だと〜スコープ」となる
結果的にスコープがどうなるかで、このケースは〜スコープと言ってるわけではなく
この宣言はどんなスコープになる種類なのかを話している

>>891
確かに同じことの言い回しの問題かもしれない

>>894
びっくりして試してみたが初期設定のCh35(現在の安定版)では"OK"が帰った
そしてES6なら(ブロックスコープ)なら"OK"が帰る

すまないが返信はまた明日の朝する
905902:2014/05/26(月) 20:53:45.60 ID:???
>>903
ありがとうございます。おかげ様ですっきりしました
私はif文内で関数を生成するなら関数式を使うのが自然だと思うので、ES6でもそのようにします

ところで、ES6 では let 以外は関数スコープとの事でしたが、const もブロックスコープではなかったでしょうか

あと、細かいことで恐縮ですが、あなたの仰る「関数定義」は「関数宣言」ではないでしょうか
ES6における関数定義は関数式を含むので文章通りに受け取るとおかしなことになってしまいます
http://people.mozilla.org/~jorendorff/es6-draft.html#sec-function-definitions
906Name_Not_Found:2014/05/26(月) 20:56:12.88 ID:???
いや、スコープは場所で決まるんだよ。

ただし、ブロックスコープで有効な変数は
letを使うってだけ。

letを使った所がブロックスコープになるのではない。
907Name_Not_Found:2014/05/26(月) 20:57:52.72 ID:???
>>905
> 私はif文内で関数を生成するなら

いや、そういう区別の仕方はおかしいでしょw

動的に関数を生成するかどうかで決めるのが正しい。
動的に関数を定義するのは、定義するタイミングが動的になってしまう。

これは静的に決まることよりもコードのメンテナンス性という意味で
悪くなってる。
908Name_Not_Found:2014/05/26(月) 20:58:36.45 ID:???
>>905
> あと、細かいことで恐縮ですが、あなたの仰る「関数定義」は「関数宣言」ではないでしょうか
宣言と定義が明確に区別されているのは、
C言語ぐらいなので、それはどうでもいいこと。
909Name_Not_Found:2014/05/26(月) 21:05:16.18 ID:???
おまえらいいかげん他でやれよ
910Name_Not_Found:2014/05/26(月) 21:09:59.85 ID:???
真面目な会話と横槍の温度差が激しい
911Name_Not_Found:2014/05/26(月) 21:18:42.82 ID:???
無名関数を直接引数にするとき以外で
ifの中で関数を生成するってあまりないなぁ。
912Name_Not_Found:2014/05/26(月) 22:22:56.23 ID:???
仕様の話と主観的な意見が入り混じっていて何だかなあ
913Name_Not_Found:2014/05/26(月) 22:37:49.43 ID:???
仕様の話なら、仕様見れで終わるわけで、
掲示板を使う理由がないんだがw
914Name_Not_Found:2014/05/26(月) 23:03:31.95 ID:???
画像を読み込むときに何%読み込み完了したか表示してるサイトとかたまにみますけど
あれはどうやってるんですか?
915Name_Not_Found:2014/05/26(月) 23:45:15.83 ID:???
しかし代替手段のないletを平気で使えるようになるのは3年は待たないと駄目だろうね

>>914
XMLHttpRequest progressイベント でggr
916Name_Not_Found:2014/05/27(火) 01:53:35.43 ID:???
変数のスコープなんて考えを使ってるから、
セキュリティホールを作り込むんだよ。
全部グローバルにすればいい。
昔の堅牢なシステムは全部それで上手くいってた。
917Name_Not_Found:2014/05/27(火) 02:14:27.39 ID:???
>>916
それどんなFortranだよ
918Name_Not_Found:2014/05/27(火) 02:35:27.41 ID:DGzKVkqL
すみません、質問です
iframeに別ドメインのページを読み込ませると、その中で動いているjqueryがエラーを頻発し
IE8でjs警告メッセージがでてきます
(例えば、$(div).〜と書いてるのがエラーになり、jQuery(div).〜に書き直したら収まるような妙なエラー)
しかし、同じページをiframeでなく直接開くとそのエラーは出ないという状況です

これは何が原因でしょうか
iframeで開く時に何か気をつけないといけないことがあるんでしょうか
919Name_Not_Found:2014/05/27(火) 07:22:47.52 ID:???
lodashで単純なforループをするにはどうしたらいいんですか?
920Name_Not_Found:2014/05/27(火) 08:10:04.49 ID:???
前の方でfunctionの問題が出ていますが
コンストラクタ定義をfunctionでして、そのprototype定義をその後ろでしていたとします
コンストラクタの前でnewしたら、
既にfunctionは定義されているのでインスタンスは生成できますが、
プロトタイプは設定されていないのでおかしくなります
function定義と同じタイミングでプロトタイプも定義する方法はありますか?
921Name_Not_Found:2014/05/27(火) 08:26:08.98 ID:???
コンストラクタだけが出来て変になるのを防ぐために
function定義はやめた方がいいってことですよね?
はい論破
922Name_Not_Found:2014/05/27(火) 10:24:36.93 ID:???
変になるのを防ぐってwwwww
せめて日本語を勉強してから論破しろよ
923Name_Not_Found
じゃあお前不完全なオブジェクト出来ていいのかよ