JavaScript を自ら学ぶ人のための質問スレッドです。
>>2-4のテンプレを読んだ上で質問してください。
■質問を書く上で
(1) 煽り、コード制作依頼等、人を不快にさせる投稿はご遠慮下さい。公序良俗を守った応対を心がけてください。
(2) 他の人に迷惑をかけるスクリプトの質問はご遠慮ください。
(ブラクラ、[戻る], [閉じる], [クリック] の妨害、画面占有など)
(3) 質問者及び議論を行う人はメール欄を空欄にし、名前にレス番を入れることを強く推奨します。回答者はなりすましを判断できませんので、なりすましが現れても自己責任となります。
(4) 常に自発的に調べる心構えを持ってください。
具体的には「自分で調べてから質問する」「回答をもらってわからない単語があればGoogle検索してみる」など。
わからない内容を代わりに調べてくれる回答者をお望みの方は余所で質問してください。
(5) 出来るだけ一般的な用語を使用してください。脳内オレオレ用語は混乱の元です。
(6) 出来るだけサンプルコードを掲示してください。言葉による説明は行き違いが生まれる場合があります。
※必ず「問題の事象が再現されること」を確認してください。
必要な部分だけ切り出したつもりで現象が再現できていなかったケアレスミスがしばしば見られます。
(7) サンプルコードに HTML が含まれる場合は http://validator.w3.org/ で [Check] してみてください。
(8) 質問を具体的かつ詳細に書くと回答を得られやすいです。>>2の質問テンプレートを活用してみてください。
(9) 時にはあなたが望む「答え」だけでなく、「意見」などが寄せられる場合もあります。
前スレ
+ JavaScript の質問用スレッド vol.124 + [転載禁止](c)2ch.net
https://mevius.5ch.net/test/read.cgi/tech/1427008785/
(ライブラリ禁止条項は、多数の意見によって廃止されました。ライブラリの質問もOKです)
+ JavaScript の質問用スレッド vol.125 +
■ このスレッドは過去ログ倉庫に格納されています
2018/02/18(日) 16:48:01.14ID:F2O3xW/S
692690
2018/05/07(月) 23:23:32.41ID:H7YotaIo JavaScript は、Ruby よりもずっと難しいから、
先にRuby やって、無料のRails チュートリアルをやれば、
MVC, web アプリの作り方がわかる
しかも、Rails以降の、多くの言語のフレームワークの基礎になっているから、
Railsを勉強していると、どの言語でも作れるようになる
他の言語でも、フレームワークを、Railsと同じように作っているから、応用できる
DB, Linux コマンド、環境構築も学べる
HTML, CSS, JavaScript, SASS,
Bootstrap などのCSS フレームワークも学べる
しかも、Rails以降の、どの言語のフレームワークにも通用する。
例えば、Node.js + Express Generator とか
先にRuby やって、無料のRails チュートリアルをやれば、
MVC, web アプリの作り方がわかる
しかも、Rails以降の、多くの言語のフレームワークの基礎になっているから、
Railsを勉強していると、どの言語でも作れるようになる
他の言語でも、フレームワークを、Railsと同じように作っているから、応用できる
DB, Linux コマンド、環境構築も学べる
HTML, CSS, JavaScript, SASS,
Bootstrap などのCSS フレームワークも学べる
しかも、Rails以降の、どの言語のフレームワークにも通用する。
例えば、Node.js + Express Generator とか
693デフォルトの名無しさん
2018/05/07(月) 23:29:49.08ID:1f9//QHH はいウソです。RailsやってもReactやAngularはわかりません。
所詮Railsはサーバーサイド用のフレームワークですからね
所詮Railsはサーバーサイド用のフレームワークですからね
694デフォルトの名無しさん
2018/05/07(月) 23:33:34.70ID:8eXYY6sB >>689
電卓アプリを作りたいので、HTMLには数字や記号のボタンを押す処理だけ書いて(ボタンを押すとJSの変数に代入などな処理を行う)、
実際の数字の繰り上がり処理や足し算とかの処理はjavascript側で処理してるんですよね
単純にゴチャゴチャしてるHTMLファイルが嫌いなだけなんですけど…
理想としては、=を押した際に、計算する関数を呼んで、計算し終わったらそのままnode.jsに変数を渡したいです
こういう場合はXMLhttpRequestの方が良いんですかね?(全く存在を知りませんでした)
Express使ってます
電卓アプリを作りたいので、HTMLには数字や記号のボタンを押す処理だけ書いて(ボタンを押すとJSの変数に代入などな処理を行う)、
実際の数字の繰り上がり処理や足し算とかの処理はjavascript側で処理してるんですよね
単純にゴチャゴチャしてるHTMLファイルが嫌いなだけなんですけど…
理想としては、=を押した際に、計算する関数を呼んで、計算し終わったらそのままnode.jsに変数を渡したいです
こういう場合はXMLhttpRequestの方が良いんですかね?(全く存在を知りませんでした)
Express使ってます
695デフォルトの名無しさん
2018/05/07(月) 23:35:41.05ID:8eXYY6sB696690
2018/05/07(月) 23:48:28.50ID:H7YotaIo 'router.post('/', function(req, res, next) {
var formula = req.body.form.input.value;
console.log(formula);
res.end();
});'
前後を' ' で囲わないし、
'/' ではなく、'/post'
>req.body.form.input.value;
req.body['message']
<form method="post" action="/hello/post">
<input type="text" name="message">
<input type="submit" value="送信">
</form>
この場合、ファイル名は、hello.js
var formula = req.body.form.input.value;
console.log(formula);
res.end();
});'
前後を' ' で囲わないし、
'/' ではなく、'/post'
>req.body.form.input.value;
req.body['message']
<form method="post" action="/hello/post">
<input type="text" name="message">
<input type="submit" value="送信">
</form>
この場合、ファイル名は、hello.js
697690
2018/05/07(月) 23:52:32.84ID:H7YotaIo YouTube のTraversy Media の動画を見てみ。
Express, Rails とか色々やってる
先にRuby やって、無料のRails チュートリアルをやっていないと、
Node.js + Express Generator の仕組みがわからないと思う
Express, Rails とか色々やってる
先にRuby やって、無料のRails チュートリアルをやっていないと、
Node.js + Express Generator の仕組みがわからないと思う
698デフォルトの名無しさん
2018/05/07(月) 23:58:21.03ID:G4y8ObMi699690
2018/05/08(火) 00:03:49.90ID:ws+EcsEk >>694
電卓アプリか
それなら、Electron (Node.js + Chromium) の方が良さそう。
VSCode も、Electron製
Electronではじめるアプリ開発
~JavaScript/HTML/CSSでデスクトップアプリを作ろう
野口 将人・倉見 洋輔、2017
電卓アプリか
それなら、Electron (Node.js + Chromium) の方が良さそう。
VSCode も、Electron製
Electronではじめるアプリ開発
~JavaScript/HTML/CSSでデスクトップアプリを作ろう
野口 将人・倉見 洋輔、2017
700690
2018/05/08(火) 00:21:16.11ID:ws+EcsEk Express Generator なら、自動的に以下が書かれている。
var bodyParser = require('body-parser');
bodyParser.json()
もし、JSON なら、HTML のContent-Type ヘッダに、
text/json か application/json という MIME タイプも必要
YouTube のTraversy Media の動画を見てみ。
Express, Rails とか色々やってる
Node.js & Express From Scratch [Part 1] - Intro & Environment
https://youtu.be/k_0ZzvHbNBQ?list=PLillGF-RfqbYRpji8t4SxUkMxfowG4Kqp
これでわからないなら、先にRuby やって、無料のRails チュートリアルから勉強する
var bodyParser = require('body-parser');
bodyParser.json()
もし、JSON なら、HTML のContent-Type ヘッダに、
text/json か application/json という MIME タイプも必要
YouTube のTraversy Media の動画を見てみ。
Express, Rails とか色々やってる
Node.js & Express From Scratch [Part 1] - Intro & Environment
https://youtu.be/k_0ZzvHbNBQ?list=PLillGF-RfqbYRpji8t4SxUkMxfowG4Kqp
これでわからないなら、先にRuby やって、無料のRails チュートリアルから勉強する
701デフォルトの名無しさん
2018/05/08(火) 00:25:00.88ID:aOEwk35o >>698
ありがとうございます
githubのExample真似ただけなので、json形式でした
XMLhttpRequestでjson形式に整形したデータを送れば良いのですかね?
それとも、text形式にしたほうが良いんですかね?
https://pastebin.com/RNfTFFUE
>>699
今回はWEBアプリケーションの練習なので、デスクトップアプリはまたの機会にしてみたいです。
ありがとうございます
githubのExample真似ただけなので、json形式でした
XMLhttpRequestでjson形式に整形したデータを送れば良いのですかね?
それとも、text形式にしたほうが良いんですかね?
https://pastebin.com/RNfTFFUE
>>699
今回はWEBアプリケーションの練習なので、デスクトップアプリはまたの機会にしてみたいです。
702デフォルトの名無しさん
2018/05/08(火) 02:14:30.98ID:aOEwk35o XMLhttpRequestでjson形式に整形したデータを送る感じで動きました
XMLhttpRequestで送るときはxhr.open("POST", "/hoge")
routes/hoge.jsで受け取るときは
router.post('/', function())
ってややこしいですね…
このせいで2時間ほど頭悩ましてました…
XMLhttpRequestで送るときはxhr.open("POST", "/hoge")
routes/hoge.jsで受け取るときは
router.post('/', function())
ってややこしいですね…
このせいで2時間ほど頭悩ましてました…
703デフォルトの名無しさん
2018/05/08(火) 17:56:42.00ID:MQbOdJc2704デフォルトの名無しさん
2018/05/08(火) 19:01:14.60ID:8rfWV9vw >>703
それ何て言うライブラリですか?
それ何て言うライブラリですか?
705デフォルトの名無しさん
2018/05/08(火) 19:24:22.02ID:hW7D1SzN 逆逆、
これからは統一するなら送信はfetch、受取はSW
これからは統一するなら送信はfetch、受取はSW
706デフォルトの名無しさん
2018/05/08(火) 20:27:07.36ID:Bm0TDQWK707デフォルトの名無しさん
2018/05/08(火) 20:36:20.78ID:8rfWV9vw708デフォルトの名無しさん
2018/05/09(水) 12:42:52.67ID:aB+Yqldr fetchが複雑?
全くそんなことはないが
全くそんなことはないが
709デフォルトの名無しさん
2018/05/09(水) 12:44:04.59ID:e8iSV/lB JavaScriptのコメントで/**/って使わないと聞いたのですか、皆さんは気にしてますか?
710デフォルトの名無しさん
2018/05/09(水) 12:51:08.11ID:28IRmfG3 普通に使うが。
例えばAirbnbのスタイルガイドでは複数行コメントは//使うな/**/使えと書いてある。
例えばAirbnbのスタイルガイドでは複数行コメントは//使うな/**/使えと書いてある。
711デフォルトの名無しさん
2018/05/09(水) 12:57:14.88ID:e8iSV/lB712デフォルトの名無しさん
2018/05/09(水) 19:18:25.01ID:m/d7G6Mi AndroidのWebViewで利用したいのですが、Googleなどの検索サイトを読み込んだ後に、JavascriptでKeyboardが出るのを無効にしたいのですが、どのような方法があるでしょうか?
キーボードの発火点である検索ボックスなどのInput要素を特定して、addEventListenerでフォーカスを登録し、
フォーカスイベント直後にblurを呼び出しフォーカスを外すなどの方法を考えたのですが,Input要素の取得がそもそもうまくいきませんでした。もっと単純な方法で、サイト全体でキーボードを無効にする方法などないでしょうか?
キーボードの発火点である検索ボックスなどのInput要素を特定して、addEventListenerでフォーカスを登録し、
フォーカスイベント直後にblurを呼び出しフォーカスを外すなどの方法を考えたのですが,Input要素の取得がそもそもうまくいきませんでした。もっと単純な方法で、サイト全体でキーボードを無効にする方法などないでしょうか?
713デフォルトの名無しさん
2018/05/09(水) 19:20:04.83ID:Ru7uYqvn ブラウザの開発者ツールを開いても
解析できないようにしたいのですがどうしたら良いのですか?
avgleというサイトみたいに
解析できないようにしたいのですがどうしたら良いのですか?
avgleというサイトみたいに
714デフォルトの名無しさん
2018/05/09(水) 19:24:56.61ID:mmGa/e1d え? avgleに限らず解析できないサイトなんてないだろ
715デフォルトの名無しさん
2018/05/09(水) 19:29:20.70ID:mmGa/e1d ブラウザのツールバーからもいけるけど、
Chromeだと
ソースコードを見る・・・CTRL+U
デベロッパーツール・・・CTRL+SHIFT+I
Chromeだと
ソースコードを見る・・・CTRL+U
デベロッパーツール・・・CTRL+SHIFT+I
716デフォルトの名無しさん
2018/05/09(水) 20:41:47.38ID:sYuR5njY 難読化ってことでは?
717デフォルトの名無しさん
2018/05/09(水) 23:29:02.17ID:zn70sK04 MDNのRegExp.prototype.testに以下が追加されていることに今気づいた。
> exec() と同様に(またはこれとコンビで)、
> test() が同じグローバル正規表現インスタンスで複数回呼び出されると、前回のマッチの先に進むことになります。
> https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test
対応してくれた人がいたのならありがとう。
> exec() と同様に(またはこれとコンビで)、
> test() が同じグローバル正規表現インスタンスで複数回呼び出されると、前回のマッチの先に進むことになります。
> https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test
対応してくれた人がいたのならありがとう。
718デフォルトの名無しさん
2018/05/09(水) 23:37:55.06ID:mmGa/e1d 俺じゃないけどどういたしまして
719デフォルトの名無しさん
2018/05/10(木) 00:17:07.08ID:DTDkVdUk720デフォルトの名無しさん
2018/05/10(木) 01:29:34.71ID:13tjCsnR >>719
いや、止まるかけど解析はできるだろって話。
debuggerステートメントを入れてれば、そこでデバッグできるように止まるが
止まるのが嫌なら、デバッガのActivate break pointsを無効にすればいいし、
デバッガで止まっていても、ソースコード見れるし
いくらでもやりたい放題
いや、止まるかけど解析はできるだろって話。
debuggerステートメントを入れてれば、そこでデバッグできるように止まるが
止まるのが嫌なら、デバッガのActivate break pointsを無効にすればいいし、
デバッガで止まっていても、ソースコード見れるし
いくらでもやりたい放題
721デフォルトの名無しさん
2018/05/10(木) 04:39:15.42ID:uFE/18Nc google map apiで地図を作ってるんですが、国内だけでマーカーを27000個ほど配置する必要があるため、クラスタリングしたいと考えてますが、
どのクラスタにどのマーカーを含めるかを、マーカー同士の距離から自動的に計算してクラスター化してくれるライブラリはないでしょうか?
どのクラスタにどのマーカーを含めるかを、マーカー同士の距離から自動的に計算してクラスター化してくれるライブラリはないでしょうか?
722デフォルトの名無しさん
2018/05/10(木) 13:35:09.44ID:JowJSHb0723デフォルトの名無しさん
2018/05/11(金) 07:08:17.25ID:c5SRReLQ ブラウザゲームで特定のタグが出現したら音がなるような仕組みを作りたいんですけど
chrome拡張のjavascriptでサイト外のサウンドをならすことってできますか?
chrome拡張のjavascriptでサイト外のサウンドをならすことってできますか?
724デフォルトの名無しさん
2018/05/11(金) 08:19:04.38ID:jXSuPkMw725デフォルトの名無しさん
2018/05/11(金) 09:01:53.27ID:c5SRReLQ726デフォルトの名無しさん
2018/05/11(金) 12:45:37.29ID:U+tgtsGQ 1行でいいよ
a = new Audio()
a.src = url
a.play()
は
new Audio(url).play()
と書けるから
a = new Audio()
a.src = url
a.play()
は
new Audio(url).play()
と書けるから
727デフォルトの名無しさん
2018/05/11(金) 17:59:04.27ID:vcb6QPtY varとfunction文を使わないjavascriptの入門書ってないですか?
728デフォルトの名無しさん
2018/05/11(金) 19:30:17.66ID:s9WibsYr letとconstとアロー関数で作るってこと?
729デフォルトの名無しさん
2018/05/11(金) 19:37:44.27ID:t3xZhjn7730デフォルトの名無しさん
2018/05/11(金) 20:40:43.55ID:AtH/WV5u ES2015入門 で検索すれば山のようにありそう
731デフォルトの名無しさん
2018/05/11(金) 23:07:20.95ID:vcb6QPtY codeacademyがes6みたいなのでこれ使ってみます
732デフォルトの名無しさん
2018/05/11(金) 23:14:52.51ID:L990LT+a functionはthisとかargumentsが使えるし排除する積極的理由が思い浮かばないんだが
733デフォルトの名無しさん
2018/05/11(金) 23:36:23.57ID:/mEoP0M0 馬鹿だからだろ
734デフォルトの名無しさん
2018/05/12(土) 00:43:23.02ID:R/twbybb thisはともかくargumentsはrest parametersでよくね?待ち望んだ本物の配列だぞ
735デフォルトの名無しさん
2018/05/12(土) 13:56:37.03ID:XdVVk9OY arguments.calleeが重要
function.selfメタプロパティにする案もあるが
function.selfメタプロパティにする案もあるが
736デフォルトの名無しさん
2018/05/12(土) 14:59:39.65ID:XO9c3rSv arguments.calleeは名前を付ければ不要
Strict Modeで使えない機能は要らん
Strict Modeで使えない機能は要らん
737デフォルトの名無しさん
2018/05/12(土) 15:53:47.45ID:XdVVk9OY 名前を付けないといけないと言うことが問題だろう
〜すれば不要だなんて何事にも言えることだし
つうかES2015の著者も提案してることからも重要性は分かるだろう
function.sentのようにfunction.meとかで入るべきだよ
〜すれば不要だなんて何事にも言えることだし
つうかES2015の著者も提案してることからも重要性は分かるだろう
function.sentのようにfunction.meとかで入るべきだよ
738デフォルトの名無しさん
2018/05/13(日) 09:29:47.91ID:zrzdYIon > 名前を付けないといけないと言うことが問題だろう
何が問題?
何が問題?
739デフォルトの名無しさん
2018/05/13(日) 11:31:36.16ID:3vS2SGRV ES2015の著者??
740デフォルトの名無しさん
2018/05/13(日) 12:04:56.38ID:DLCzIG2W >>738
無名関数に再起をするためだけに外にも分かる名前を付けないといけないのは問題だろう
そもそも名前を付けるに値しない、付けなくても良いような関数であっても
無理やり固有の名前を付けないといけないということなんだからさ
仮に名前が最初から付いていたとしても、super()のように関係性による参照は重要
無名関数に再起をするためだけに外にも分かる名前を付けないといけないのは問題だろう
そもそも名前を付けるに値しない、付けなくても良いような関数であっても
無理やり固有の名前を付けないといけないということなんだからさ
仮に名前が最初から付いていたとしても、super()のように関係性による参照は重要
741デフォルトの名無しさん
2018/05/13(日) 12:18:18.48ID:QSiC/kkG 自分を呼び出したりプロパティ生やしたり
複雑なことするならちゃんと名前を付けるべきだと思うの
複雑なことするならちゃんと名前を付けるべきだと思うの
742デフォルトの名無しさん
2018/05/13(日) 12:21:35.42ID:zrzdYIon >>737
> function.sentのようにfunction.meとかで入るべきだよ
arguments.callee 問題を回避する為には this 値束縛の例外機構が必要で関数呼び出しの処理に手を入れる必要がある
これは「arguments.callee 問題を知っている人にとっては」直観的な動作ではなく、分かりづらい
>>740
> 無名関数に再起をするためだけに外にも分かる名前を付けないといけないのは問題だろう
名前付き関数式はスコープが外に漏れないよ
> そもそも名前を付けるに値しない、付けなくても良いような関数であっても
それは発想力の問題であって、名前を付ける方がリーダブルコード的には正しいと思う
特に再帰関数は可読性を下げるので、名前はあった方が分かりやすい
jQueryに代表される「とにかく無名関数式を使え」な偏重的傾向は可読性とは正反対のポリシーでしかないので、好ましくないと個人的には思ってる
彼らの主張は「ショートコーディング最高!名前を付けるのは悪!」という感じでどうにも共感できない
> function.sentのようにfunction.meとかで入るべきだよ
arguments.callee 問題を回避する為には this 値束縛の例外機構が必要で関数呼び出しの処理に手を入れる必要がある
これは「arguments.callee 問題を知っている人にとっては」直観的な動作ではなく、分かりづらい
>>740
> 無名関数に再起をするためだけに外にも分かる名前を付けないといけないのは問題だろう
名前付き関数式はスコープが外に漏れないよ
> そもそも名前を付けるに値しない、付けなくても良いような関数であっても
それは発想力の問題であって、名前を付ける方がリーダブルコード的には正しいと思う
特に再帰関数は可読性を下げるので、名前はあった方が分かりやすい
jQueryに代表される「とにかく無名関数式を使え」な偏重的傾向は可読性とは正反対のポリシーでしかないので、好ましくないと個人的には思ってる
彼らの主張は「ショートコーディング最高!名前を付けるのは悪!」という感じでどうにも共感できない
743デフォルトの名無しさん
2018/05/13(日) 15:20:12.22ID:DLCzIG2W >>741
でも自分自身を呼び出すことが目的であって、例えば関数meを呼び出すことが目的じゃないからね
関数名meをmyに変えたら変更しないといけなくなってしまうし
superの例と同じくそこは抽象的な物があったほうがいいんじゃない?
>>742
普通の名前付き関数式は確かにもれないが、
アロー関数とかも「fn(()=>{})」の代わりに「let cb;fn(cb=()=>{})」とかにしろってことでしょ?
あと変数はできるだけ名前を短くして寿命(スコープ)を短くするのが良いと個人的には思うよ
ショートコーディング最高というのではなくてね、
昔のとある言語界のようにスコープが広くて説明口調の何十文字もある関数名が好まれていたものの対局としてね
汎用的な関数とか、関数の引数のような使われる範囲の広い名前は比較的きっちり決めるべきだけどね
そうでないものは、それこそ一旦途中計算をとっておくようなものはtempか、
スコープ狭くてそこの2行で使わないようなものならtでも十分
でも自分自身を呼び出すことが目的であって、例えば関数meを呼び出すことが目的じゃないからね
関数名meをmyに変えたら変更しないといけなくなってしまうし
superの例と同じくそこは抽象的な物があったほうがいいんじゃない?
>>742
普通の名前付き関数式は確かにもれないが、
アロー関数とかも「fn(()=>{})」の代わりに「let cb;fn(cb=()=>{})」とかにしろってことでしょ?
あと変数はできるだけ名前を短くして寿命(スコープ)を短くするのが良いと個人的には思うよ
ショートコーディング最高というのではなくてね、
昔のとある言語界のようにスコープが広くて説明口調の何十文字もある関数名が好まれていたものの対局としてね
汎用的な関数とか、関数の引数のような使われる範囲の広い名前は比較的きっちり決めるべきだけどね
そうでないものは、それこそ一旦途中計算をとっておくようなものはtempか、
スコープ狭くてそこの2行で使わないようなものならtでも十分
744デフォルトの名無しさん
2018/05/13(日) 15:55:10.12ID:zrzdYIon >>743
結局、function.me で arguments.callee 問題をどう解決するの?
> アロー関数とかも「fn(()=>{})」の代わりに「let cb;fn(cb=()=>{})」とかにしろってことでしょ?
そんなことはいっていない
自分が主張しているのは名前付き関数式
> あと変数はできるだけ名前を短くして寿命(スコープ)を短くするのが良いと個人的には思うよ
名前を短くしても寿命は短くならない
同様に名前を無くすことで寿命が短くなることもない
それはただの論理のすり替え
結局、function.me で arguments.callee 問題をどう解決するの?
> アロー関数とかも「fn(()=>{})」の代わりに「let cb;fn(cb=()=>{})」とかにしろってことでしょ?
そんなことはいっていない
自分が主張しているのは名前付き関数式
> あと変数はできるだけ名前を短くして寿命(スコープ)を短くするのが良いと個人的には思うよ
名前を短くしても寿命は短くならない
同様に名前を無くすことで寿命が短くなることもない
それはただの論理のすり替え
745デフォルトの名無しさん
2018/05/13(日) 16:08:51.21ID:zrzdYIon > アロー関数とかも「fn(()=>{})」の代わりに「let cb;fn(cb=()=>{})」とかにしろってことでしょ?
そもそも、これは再帰関数ではなく、コールバック関数
そもそも、これは再帰関数ではなく、コールバック関数
746デフォルトの名無しさん
2018/05/13(日) 16:11:38.32ID:sfb0ZC2W ここで言う arguments.callee 問題 ってどういうもの?
747デフォルトの名無しさん
2018/05/13(日) 16:28:09.92ID:zrzdYIon748デフォルトの名無しさん
2018/05/13(日) 16:51:22.54ID:sfb0ZC2W なるほど、ありがとう。
749デフォルトの名無しさん
2018/05/13(日) 17:50:15.21ID:DLCzIG2W >>744-747
だから例えばそうやって他に渡された関数がその先で自己呼び出しするためには
定義した場所で名前を付けて置かないといけないでしょ?
()で囲んだ即時関数にしろ、コールバックにしろ、式中でアロー関数を定義する場合は
宣言を別にしないといけないし不格好になるよという例だよ
それで結局、君はアロー関数中の使用なら必要性を認めるし問題は無いということでOK?
君がやけに拘るthis値もアロー関数は定義された場所のthis値で固定されるんだから
そもそもどのように参照がされようがthis値が変わったりはしないのは自明で
そこに何も新しいことや考えないといけないことは生まれない
そもそもアローでない関数に関してもメタプロパティなんだから仕様でどうとでもできる話
function.me()と読んだらthisがfunctionになるわけでもあるまいし
まあ自然なのはfunction.meというキーワードが自己関数を素朴に参照することだろう
つまりme()のようにfunction.me()とできればいいし、
me.call()のようにfunction.me.call()とできればいい
だから例えばそうやって他に渡された関数がその先で自己呼び出しするためには
定義した場所で名前を付けて置かないといけないでしょ?
()で囲んだ即時関数にしろ、コールバックにしろ、式中でアロー関数を定義する場合は
宣言を別にしないといけないし不格好になるよという例だよ
それで結局、君はアロー関数中の使用なら必要性を認めるし問題は無いということでOK?
君がやけに拘るthis値もアロー関数は定義された場所のthis値で固定されるんだから
そもそもどのように参照がされようがthis値が変わったりはしないのは自明で
そこに何も新しいことや考えないといけないことは生まれない
そもそもアローでない関数に関してもメタプロパティなんだから仕様でどうとでもできる話
function.me()と読んだらthisがfunctionになるわけでもあるまいし
まあ自然なのはfunction.meというキーワードが自己関数を素朴に参照することだろう
つまりme()のようにfunction.me()とできればいいし、
me.call()のようにfunction.me.call()とできればいい
750デフォルトの名無しさん
2018/05/13(日) 18:38:44.63ID:zrzdYIon >>749
> だから例えばそうやって他に渡された関数がその先で自己呼び出しするためには
だから、名前付き関数式なら自己呼び出しできると説明したよね?
繰り返すけど、
- 名前を短くしても寿命は短くならない
- 同様に名前を無くすことで寿命が短くなることもない
- 再帰関数は可読性を下げるので、名前はあった方が分かりやすい
> それで結局、君はアロー関数中の使用なら必要性を認めるし問題は無いということでOK?
アロー関数には名前を付ける機構があって良いとは思うけど、arguments.callee は必要性を感じない
> つまりme()のようにfunction.me()とできればいいし、
それが直観的でない事は>>742で説明した
拡張するなら、@callee() とかの方がまだわかりやすい
ただし、自己呼び出しなら「名前を付ける機構さえあればいい」
スコープを無駄に拡張する必要はない
> だから例えばそうやって他に渡された関数がその先で自己呼び出しするためには
だから、名前付き関数式なら自己呼び出しできると説明したよね?
繰り返すけど、
- 名前を短くしても寿命は短くならない
- 同様に名前を無くすことで寿命が短くなることもない
- 再帰関数は可読性を下げるので、名前はあった方が分かりやすい
> それで結局、君はアロー関数中の使用なら必要性を認めるし問題は無いということでOK?
アロー関数には名前を付ける機構があって良いとは思うけど、arguments.callee は必要性を感じない
> つまりme()のようにfunction.me()とできればいいし、
それが直観的でない事は>>742で説明した
拡張するなら、@callee() とかの方がまだわかりやすい
ただし、自己呼び出しなら「名前を付ける機構さえあればいい」
スコープを無駄に拡張する必要はない
751デフォルトの名無しさん
2018/05/13(日) 18:44:11.30ID:zrzdYIon >>744で「自分が主張しているのは名前付き関数式」といってるのに、彼はアロー関数の問題に執拗にこだわるから論点が曖昧になってる
アロー関数の問題は「名前を付ける機構がないこと」
解決するには、「アロー関数に名前を付ける機構を作ってくれればいい」
関数式は現状維持で何の問題もない、以上
アロー関数の問題は「名前を付ける機構がないこと」
解決するには、「アロー関数に名前を付ける機構を作ってくれればいい」
関数式は現状維持で何の問題もない、以上
752デフォルトの名無しさん
2018/05/13(日) 19:08:29.05ID:xJg351Wg console.log((n => {let fact = n => n ? n * fact(n-1) : 1; return fact(n);})(5));
753デフォルトの名無しさん
2018/05/13(日) 20:48:36.27ID:DLCzIG2W >>751
非アロー関数にこだわってるのは君の方でしょ
というか君の言い方を真似して言うと、
ただアロー関数の問題に気が付いて無かっただけでしょ
というかfunction.meが直感的で無いっていうのは
this周りの話だと思うけど、そのことについてはsuperを例に挙げたじゃん
直感的で無いと感じるのはただ単に君がメタプロパティに馴染みがないからでしょ
super.method()、new.target()としたときthisについて、
またはfunction.sentが採用されればそれについて知っていれば何も違和感なんて生じようがないよ
それにメタプロパティの良いところは、新しい予約語も記号も消化せずに済むところなんだから
@とかJSの残り少ない貴重な資源でしょ
非アロー関数にこだわってるのは君の方でしょ
というか君の言い方を真似して言うと、
ただアロー関数の問題に気が付いて無かっただけでしょ
というかfunction.meが直感的で無いっていうのは
this周りの話だと思うけど、そのことについてはsuperを例に挙げたじゃん
直感的で無いと感じるのはただ単に君がメタプロパティに馴染みがないからでしょ
super.method()、new.target()としたときthisについて、
またはfunction.sentが採用されればそれについて知っていれば何も違和感なんて生じようがないよ
それにメタプロパティの良いところは、新しい予約語も記号も消化せずに済むところなんだから
@とかJSの残り少ない貴重な資源でしょ
754デフォルトの名無しさん
2018/05/13(日) 21:27:47.15ID:BDCG9r61 こっちでもアロー関数ネタやってんのかよw
向こうでも同じことを言ったがな
アロー関数は、functionの代替、短い書き方じゃねぇ。
関数を値のように扱うためのものだ。
基本は n => func(n) の形、=> の左の部分は他の書き方でもいいけど
=> の右側に { retun hoge } みたいに {} や returnを使おうと思ったら
それはアンチパターンだ
そんな複雑な処理をするためのものじゃねぇ
だから再起に使おうとか思うんじゃねーよw
向こうでも同じことを言ったがな
アロー関数は、functionの代替、短い書き方じゃねぇ。
関数を値のように扱うためのものだ。
基本は n => func(n) の形、=> の左の部分は他の書き方でもいいけど
=> の右側に { retun hoge } みたいに {} や returnを使おうと思ったら
それはアンチパターンだ
そんな複雑な処理をするためのものじゃねぇ
だから再起に使おうとか思うんじゃねーよw
755デフォルトの名無しさん
2018/05/13(日) 22:07:23.07ID:3vS2SGRV 妄想納得くん向こうでミジメに敗退してるじゃんw
ソースは?w
ソースは?w
756デフォルトの名無しさん
2018/05/13(日) 22:11:17.68ID:pUJSFzDo >>754
少なくともお前は間違っていると思う
少なくともお前は間違っていると思う
757デフォルトの名無しさん
2018/05/13(日) 22:22:40.53ID:xJg351Wg アロー関数のほうが自然だから基本的にはアロー関数を使いたいね
758デフォルトの名無しさん
2018/05/14(月) 05:21:56.64ID:dp1K5uLv 関数は昔から値として扱えるよね
アローは this の束縛が特徴だと思ってるが
アローは this の束縛が特徴だと思ってるが
759デフォルトの名無しさん
2018/05/14(月) 06:42:29.35ID:w31iHQx1 誤解されるから訂正するよ
× 値として使う
○ 引数として使う
× 値として使う
○ 引数として使う
760デフォルトの名無しさん
2018/05/14(月) 09:14:08.97ID:CFjIOj0l761デフォルトの名無しさん
2018/05/14(月) 19:07:34.18ID:oJMco7ca 732だがまさかこんなに熱い議論になるとは思わなかった
軽い気持ちでargumentsを話題に出してしまって申し訳ない
軽い気持ちでargumentsを話題に出してしまって申し訳ない
762デフォルトの名無しさん
2018/05/14(月) 20:41:31.32ID:w31iHQx1 いいってことよ。なんでもおもちゃにするだけの話だしな
763デフォルトの名無しさん
2018/05/16(水) 08:52:28.96ID:U06fQouG ブラウザゲームのデータをよんでサーバーに記録するようなのを作りたくて
chrome extension で実装したんですがデベロッパーモードにしないで動かすにはどうすればいいんでしょうか
自分用につくったんですけど知り合いも使いたいみたいで導入ハードルをさげたいんですよね
あとプレーヤーごとにデータをわけて個別にマイページ表示したいので
送信するPOSTのなかにユーザIDなり暗号化したトークンなりをいれたいんですが
どうやって実装するのが簡単でしょうか
配布する chrome extension を共通にしてその中の post の内容を外からの変数でかえることってできるんでしょうか
あるいはプレーヤーごとに ID をうめこんだ extension ファイルを配ったほうがいいのでしょうか
chrome extension で実装したんですがデベロッパーモードにしないで動かすにはどうすればいいんでしょうか
自分用につくったんですけど知り合いも使いたいみたいで導入ハードルをさげたいんですよね
あとプレーヤーごとにデータをわけて個別にマイページ表示したいので
送信するPOSTのなかにユーザIDなり暗号化したトークンなりをいれたいんですが
どうやって実装するのが簡単でしょうか
配布する chrome extension を共通にしてその中の post の内容を外からの変数でかえることってできるんでしょうか
あるいはプレーヤーごとに ID をうめこんだ extension ファイルを配ったほうがいいのでしょうか
764デフォルトの名無しさん
2018/05/16(水) 09:02:16.89ID:mth5HURG >>732
> functionはthisとかargumentsが使えるし排除する積極的理由が思い浮かばないんだが
その通りだと思う
アロー関数だけにしたら、this値束縛でいろいろと弊害が出てくる
- call,apply,bindが使えない
- addEventListenerの第二引数に非関数オブジェクトを指定しても無効
> functionはthisとかargumentsが使えるし排除する積極的理由が思い浮かばないんだが
その通りだと思う
アロー関数だけにしたら、this値束縛でいろいろと弊害が出てくる
- call,apply,bindが使えない
- addEventListenerの第二引数に非関数オブジェクトを指定しても無効
765デフォルトの名無しさん
2018/05/16(水) 11:51:28.93ID:cqesdbVb766デフォルトの名無しさん
2018/05/16(水) 12:08:44.49ID:U06fQouG 回等ありがとうございます
chrome拡張の話はスレ違いなんですね
気をつけます
chrome拡張の話はスレ違いなんですね
気をつけます
767デフォルトの名無しさん
2018/05/16(水) 20:43:11.69ID:q1HJlXu8768デフォルトの名無しさん
2018/05/16(水) 20:59:52.14ID:IfIzhtS9 ドラフトじゃん
769デフォルトの名無しさん
2018/05/16(水) 22:41:52.64ID:U06fQouG スレ違いじゃないならききたいんですけど
乱数で作って保存するっていうのはどこに保存すればいいんでしょうか?
識別する文字列を鯖側で乱数作成するにしても
ユーザがアカウント名として入力するでもいいんですが
配布する拡張機能側にうめこむ方法がわかりません
ユーザごとにIDをうめこんだ違うファイルを配るか
拡張機能内に何かしら入力欄を作って入力しないと無理ですよね?
乱数で作って保存するっていうのはどこに保存すればいいんでしょうか?
識別する文字列を鯖側で乱数作成するにしても
ユーザがアカウント名として入力するでもいいんですが
配布する拡張機能側にうめこむ方法がわかりません
ユーザごとにIDをうめこんだ違うファイルを配るか
拡張機能内に何かしら入力欄を作って入力しないと無理ですよね?
770デフォルトの名無しさん
2018/05/16(水) 22:46:17.65ID:kpFCptG2 >>769
自分で読み直してみて, 何がしたいのかその文章から読み取ってもらえると思う?
自分で読み直してみて, 何がしたいのかその文章から読み取ってもらえると思う?
771デフォルトの名無しさん
2018/05/16(水) 23:34:27.83ID:Y6ns+IX+ >>769
普通にストレージはchrome.storage.localとかで提供されてるけど。
エクステンションごとに保存先が独立して用意される。
ちなみにgoogle認証とかで識別したほうが楽じゃない。
乱数だとエクステンションをアンインストールしたタイミングでヒモ付が消えることになる
普通にストレージはchrome.storage.localとかで提供されてるけど。
エクステンションごとに保存先が独立して用意される。
ちなみにgoogle認証とかで識別したほうが楽じゃない。
乱数だとエクステンションをアンインストールしたタイミングでヒモ付が消えることになる
772デフォルトの名無しさん
2018/05/17(木) 02:10:24.80ID:wyBemBjG >>770
拡張機能をインストールしてブラゲーページをみたとき
特定の画面でDOMを抜き出す + ユーザ識別トークンを付与してサーバー送信
サーバー(PSP CGI)は受け取ったデータをユーザ識別トークンごとに保存
表示ページではユーザ全体の集計結果を公開してログインするとユーザごとの個別データが見られる
というイメージなんですけど
拡張機能側で毎回同じ識別トークンを知るor個別に作るにはどうしたらいいのかなって
PHPもJSも4月から覚えたばかりでウェブアプリつくるの自体がはじめてなので
認識が間違ってたらごめんなさい
>>771
わー ありがとうございます!
localStrageっていうの localStrage.put() get() だけで使えたので簡単そう
初回アクセス時にクライアント側で乱数を生成してlocalStrageに保存して
localStrageから取り出してつけるだけでいけそうです
これ実態はメモリじゃなくてファイルになってるんでしょうか
PCの電源落としたりセッションやIPがかわっても毎回取り出せるのかな
有効期限のないクッキーみたいなもの?
google認証軽くしらべてみたんですけど理解できなかったので自分には難しそうです
サンプルコードいくつかみたけどどれも何かしら入力文字列があったので
ユーザは何も入力しなくてもサーバー側で固有のトークンを取り出せるんでしょうか
とりあえずlocalStrage使う方向ですすめてみます
本当にありがとうございました!
拡張機能をインストールしてブラゲーページをみたとき
特定の画面でDOMを抜き出す + ユーザ識別トークンを付与してサーバー送信
サーバー(PSP CGI)は受け取ったデータをユーザ識別トークンごとに保存
表示ページではユーザ全体の集計結果を公開してログインするとユーザごとの個別データが見られる
というイメージなんですけど
拡張機能側で毎回同じ識別トークンを知るor個別に作るにはどうしたらいいのかなって
PHPもJSも4月から覚えたばかりでウェブアプリつくるの自体がはじめてなので
認識が間違ってたらごめんなさい
>>771
わー ありがとうございます!
localStrageっていうの localStrage.put() get() だけで使えたので簡単そう
初回アクセス時にクライアント側で乱数を生成してlocalStrageに保存して
localStrageから取り出してつけるだけでいけそうです
これ実態はメモリじゃなくてファイルになってるんでしょうか
PCの電源落としたりセッションやIPがかわっても毎回取り出せるのかな
有効期限のないクッキーみたいなもの?
google認証軽くしらべてみたんですけど理解できなかったので自分には難しそうです
サンプルコードいくつかみたけどどれも何かしら入力文字列があったので
ユーザは何も入力しなくてもサーバー側で固有のトークンを取り出せるんでしょうか
とりあえずlocalStrage使う方向ですすめてみます
本当にありがとうございました!
773デフォルトの名無しさん
2018/05/17(木) 08:24:04.09ID:b0UFX98N774デフォルトの名無しさん
2018/05/17(木) 10:27:39.72ID:X1pFA/4b どうにもわからないことがあります
例えばHTMLの中に<a onclick="hoge()">と書いてあるとして
そのhoge関数はどのスクリプトにあるhoge()が呼ばれるんでしょうか?ブラウザでは同時にいくつものjavascriptが走っていると思うんですが
試しにGreasemonkeyでスクリプトfugaを作りそこからHTMLの適当な要素にonclick="hoge()"を追記して発火させてみると
ちゃんとGreasemonkey下のfugaスクリプト内のhoge()が呼ばれますが
ブラウザはどうしてhoge関数がGreasemonkey下のfugaスクリプト内にあると分かるんでしょうか?
動いている全てのスクリプトの関数名を走査しているんでしょうか
だとしたらhoge()とたまたま同名の関数が他のスクリプトにあったらどっちにいってしまうのか
確実にfuga内のhoge関数を呼ぶようにonclickに指定する方法はないのか
が分かりません…
例えばHTMLの中に<a onclick="hoge()">と書いてあるとして
そのhoge関数はどのスクリプトにあるhoge()が呼ばれるんでしょうか?ブラウザでは同時にいくつものjavascriptが走っていると思うんですが
試しにGreasemonkeyでスクリプトfugaを作りそこからHTMLの適当な要素にonclick="hoge()"を追記して発火させてみると
ちゃんとGreasemonkey下のfugaスクリプト内のhoge()が呼ばれますが
ブラウザはどうしてhoge関数がGreasemonkey下のfugaスクリプト内にあると分かるんでしょうか?
動いている全てのスクリプトの関数名を走査しているんでしょうか
だとしたらhoge()とたまたま同名の関数が他のスクリプトにあったらどっちにいってしまうのか
確実にfuga内のhoge関数を呼ぶようにonclickに指定する方法はないのか
が分かりません…
775デフォルトの名無しさん
2018/05/17(木) 11:02:58.88ID:clCaeeqI >>774
何がわかんないのかよくわからないな。
同時に幾つものjsが走っているというのはあくまでタブ単位の話
複数のタブにまたがってグローバルスコープは共有しないから大丈夫
でも同名の関数が衝突することはあるから確かに気をついないとダメだね。
何がわかんないのかよくわからないな。
同時に幾つものjsが走っているというのはあくまでタブ単位の話
複数のタブにまたがってグローバルスコープは共有しないから大丈夫
でも同名の関数が衝突することはあるから確かに気をついないとダメだね。
776774
2018/05/17(木) 12:03:22.10ID:X1pFA/4b >>775
レスありがとうございます
他のタブの関数が呼ばれてしまうということは心配していないのですが
同じ1つのタブの中でもサイト作者が作ったJS、ブラウザアドオンのJS、GreasemonkeyのJS、と複数走っていますよね?
そこで同名の関数があったらどうなるんでしょう?
また確実に自分のスクリプトの中の関数を呼ぶ方法があれば知りたいです
またmin()とかmax()みたいにごく短くてありふれた名前の下位関数を作ることはよくあると思うんですが
関数名がブラウザには全部一緒くたに記憶されているんだとしたらそれすらも危険という気がしてきました
自作スクリプト全体を(function(){…})()で包んだとしても、先程の例のhoge()が呼べてしまうので
やはりmin()やmax()も宣言すれば全体から見えてしまう(上書きしている?)のでしょうか?
レスありがとうございます
他のタブの関数が呼ばれてしまうということは心配していないのですが
同じ1つのタブの中でもサイト作者が作ったJS、ブラウザアドオンのJS、GreasemonkeyのJS、と複数走っていますよね?
そこで同名の関数があったらどうなるんでしょう?
また確実に自分のスクリプトの中の関数を呼ぶ方法があれば知りたいです
またmin()とかmax()みたいにごく短くてありふれた名前の下位関数を作ることはよくあると思うんですが
関数名がブラウザには全部一緒くたに記憶されているんだとしたらそれすらも危険という気がしてきました
自作スクリプト全体を(function(){…})()で包んだとしても、先程の例のhoge()が呼べてしまうので
やはりmin()やmax()も宣言すれば全体から見えてしまう(上書きしている?)のでしょうか?
777デフォルトの名無しさん
2018/05/17(木) 12:30:50.49ID:CnmZ72XP Greasemonkeyは使ったことないのでよく分からないけど同一スコープで同名の関数が複数定義された場合後勝ちになるよ
あと現在のスコープに関数定義が見つからない場合1つ外側のスコープを探しに行くよ
あと現在のスコープに関数定義が見つからない場合1つ外側のスコープを探しに行くよ
778デフォルトの名無しさん
2018/05/17(木) 13:32:25.37ID:Vzlnwp7F >>776
Browserアドオン。エクステンションに関しては別の処理系で動いているから名前衝突は起こさない。ただしDomだけは共有してる。
Browserアドオン。エクステンションに関しては別の処理系で動いているから名前衝突は起こさない。ただしDomだけは共有してる。
779774
2018/05/17(木) 14:00:11.16ID:X1pFA/4b >>777-778
ありがとうございます
そこで最初の疑問になるのですが
Greasemonkeyやブラウザアドオンのjsからdocumentの要素にonclick="hoge()"等と書き加えた場合、
いざページを見ていてユーザーがその要素をクリックした時は、ブラウザからはHTML(DOM)だけを見ているのであれば
hoge()がどこのスクリプトから書き加えられたか分からない(どのスコープのその関数を呼べばいいか分からない)と思うのです。
その時でもなぜちゃんとhoge()が呼ばれるのかしっくりきません
また確実に自分のスクリプトを呼ばせる方法が知りたいです
ありがとうございます
そこで最初の疑問になるのですが
Greasemonkeyやブラウザアドオンのjsからdocumentの要素にonclick="hoge()"等と書き加えた場合、
いざページを見ていてユーザーがその要素をクリックした時は、ブラウザからはHTML(DOM)だけを見ているのであれば
hoge()がどこのスクリプトから書き加えられたか分からない(どのスコープのその関数を呼べばいいか分からない)と思うのです。
その時でもなぜちゃんとhoge()が呼ばれるのかしっくりきません
また確実に自分のスクリプトを呼ばせる方法が知りたいです
780デフォルトの名無しさん
2018/05/17(木) 17:35:57.36ID:YPyHndu4 >>779
その要素のaddEventListenerを呼び出して該当関数を渡せばいい
その要素のaddEventListenerを呼び出して該当関数を渡せばいい
781デフォルトの名無しさん
2018/05/17(木) 21:07:32.64ID:Yj64Z3R2782デフォルトの名無しさん
2018/05/17(木) 21:44:36.42ID:CnmZ72XP >>779
その書き方だとグローバル変数hogeかグローバルスコープに定義されているhoge関数が実行されるよ
どのファイルかを気にしているけれどJavaScriptはファイル単位でスコープが分かれるわけではないよ
ファイルAでグローバルスコープにhoge関数を定義してファイルBでbuttonのonclick属性にhogeを追加するとして、どちらのファイルも読み込まれた後にbuttonをクリックすればhogeは実行されるはずだよ
その書き方だとグローバル変数hogeかグローバルスコープに定義されているhoge関数が実行されるよ
どのファイルかを気にしているけれどJavaScriptはファイル単位でスコープが分かれるわけではないよ
ファイルAでグローバルスコープにhoge関数を定義してファイルBでbuttonのonclick属性にhogeを追加するとして、どちらのファイルも読み込まれた後にbuttonをクリックすればhogeは実行されるはずだよ
783774
2018/05/17(木) 22:40:53.71ID:X1pFA/4b ありがとうございます
まとめて書きます
ファイルA.jsとファイルB.jsの作者がまったく別の人でお互いの内容を知らず、
まず順番が来たファイルAがbuttonのonclickにhoge関数を追加してhoge関数の本体も定義、
次に順番が来たファイルBがimgのonclickに(たまたま同名の)hoge関数を追加してhoge関数の本体も定義した(内容は全くの別物)という場合、
buttonやimgをクリックした時にファイルAのhoge本体とファイルBのhoge本体のどちらが呼ばれるのか?という問題が分からないのです
関数名はグローバルスコープで全て共有されるとしたら後で定義したほうが勝ちになるというのは分かるのですが
だとするとスクリプト全体を(function(){…})()で包むということの意味は何になるのでしょうか?
包んだ変数名や関数名をグローバルスコープから隠すことだと思っていたのですが
まとめて書きます
ファイルA.jsとファイルB.jsの作者がまったく別の人でお互いの内容を知らず、
まず順番が来たファイルAがbuttonのonclickにhoge関数を追加してhoge関数の本体も定義、
次に順番が来たファイルBがimgのonclickに(たまたま同名の)hoge関数を追加してhoge関数の本体も定義した(内容は全くの別物)という場合、
buttonやimgをクリックした時にファイルAのhoge本体とファイルBのhoge本体のどちらが呼ばれるのか?という問題が分からないのです
関数名はグローバルスコープで全て共有されるとしたら後で定義したほうが勝ちになるというのは分かるのですが
だとするとスクリプト全体を(function(){…})()で包むということの意味は何になるのでしょうか?
包んだ変数名や関数名をグローバルスコープから隠すことだと思っていたのですが
784デフォルトの名無しさん
2018/05/17(木) 22:41:39.44ID:xJtGZ4kt >>783
やってみ
やってみ
785デフォルトの名無しさん
2018/05/17(木) 22:42:37.94ID:4QIso6lE >>783
関数スコープでぐぐれ
関数スコープでぐぐれ
786774
2018/05/17(木) 22:56:03.69ID:X1pFA/4b ↑の補記
話を具体的にするために言い換えますと、
仮にファイルAはウェブサイト側のjs、ファイルBはブラウザアドオンのjsだとします
ブラウザアドオン側のjsの作者は、ウェブサイト側のjsで作って使っている関数名を全て調べて知っておく(そして衝突を避ける)
なんてことをするのは現実的ではないと思うのですが
どうやって衝突を避けるのでしょう? という疑問なのです
ファイルAのjs内で呼び合っている関数ならスコープで保護されるのは分かるのですが
HTML(DOM)のonclick等に書いてしまった場合スコープ情報が抜け落ちるような気がするのです
細かい話ですが、要素のaddEventListenerに登録する場合も、そのまま関数名だけならスコープ情報を登録してくれそうな気がしますが
関数に引数を渡したくてaddEventListener("click","function(){hoge(a,b,c)}",false)のように登録してしまった場合はやはりスコープ情報が抜け落ちそうな気がするのですが
そんなことはないのでしょうか?
話を具体的にするために言い換えますと、
仮にファイルAはウェブサイト側のjs、ファイルBはブラウザアドオンのjsだとします
ブラウザアドオン側のjsの作者は、ウェブサイト側のjsで作って使っている関数名を全て調べて知っておく(そして衝突を避ける)
なんてことをするのは現実的ではないと思うのですが
どうやって衝突を避けるのでしょう? という疑問なのです
ファイルAのjs内で呼び合っている関数ならスコープで保護されるのは分かるのですが
HTML(DOM)のonclick等に書いてしまった場合スコープ情報が抜け落ちるような気がするのです
細かい話ですが、要素のaddEventListenerに登録する場合も、そのまま関数名だけならスコープ情報を登録してくれそうな気がしますが
関数に引数を渡したくてaddEventListener("click","function(){hoge(a,b,c)}",false)のように登録してしまった場合はやはりスコープ情報が抜け落ちそうな気がするのですが
そんなことはないのでしょうか?
787デフォルトの名無しさん
2018/05/17(木) 23:11:50.85ID:pwDnHRNO どこをどう話せば良いか分からんし、スコープ情報ってなんや?っ感じだけど
前提として衝突を100%回避するのは無理
是非はともかくjQueryやlodashなんかは1文字に全てを押し込めて衝突を避けてるけど
サイト側が$を使っちゃうとそれまでの話
前提として衝突を100%回避するのは無理
是非はともかくjQueryやlodashなんかは1文字に全てを押し込めて衝突を避けてるけど
サイト側が$を使っちゃうとそれまでの話
788デフォルトの名無しさん
2018/05/17(木) 23:55:51.71ID:XNPFfb6W window.jQuery = window.$ = jQuery;
jQueryのソースコードでは、windowの、jQuery, $ に、
jQueryオブジェクトを代入してる
この2つだけが、グローバル変数
jQueryのソースコードでは、windowの、jQuery, $ に、
jQueryオブジェクトを代入してる
この2つだけが、グローバル変数
789デフォルトの名無しさん
2018/05/18(金) 00:20:55.09ID:aN049InP >>774
イベントハンドラーを、<a onclick="hoge()"> のように、HTML に直接書くのは、ダメ!
jQuery の、on とかで、JavaScript から設定する
モジュール管理は、Node.js が使っている、CommonJS とか。
ES6(2015) で、import文ができた
JavaScript, jQuery の質問は、
この板よりも、web制作管理板へ書き込んだ方が良い
そちらの方が、人が多い
イベントハンドラーを、<a onclick="hoge()"> のように、HTML に直接書くのは、ダメ!
jQuery の、on とかで、JavaScript から設定する
モジュール管理は、Node.js が使っている、CommonJS とか。
ES6(2015) で、import文ができた
JavaScript, jQuery の質問は、
この板よりも、web制作管理板へ書き込んだ方が良い
そちらの方が、人が多い
790デフォルトの名無しさん
2018/05/18(金) 00:50:52.81ID:QeKi0vmL >>787,788の言う通り完全に衝突を避けるのは不可能だけど実際上ほとんど問題にならないよ
グローバルスコープで発生する名前の衝突を避けるには不要なオブジェクトをグローバルスコープに曝さなければいいんだよ
ライブラリではそのために特定の名前に全部詰め込んでそれだけをグローバルスコープに晒したりしているよ
あとはwindow.foo.barみたいに独自のネームスペースを切り出してその中だけを使うといったやり方もあるよ
javaが分かるならパッケージ名みたいなものだと言えば伝わるかな
(function(){})()の意味は無名関数の即時実行だよ
スコープの話と絡めると良くあるのは(function(global){var foo; ... global.bar=foo;})(window)みたいな使い方だよ
この例だとグローバルスコープにbarと言う名前でfooというオブジェクトを曝してるよ
あとはえーと、addEventListenerで登録するのは関数の名前じゃなくてFunctionオブジェクトそのものだよ
無名関数も登録できるよね
リスナーが実行されるときに名前で関数を探しているわけではないんだよ
グローバルスコープで発生する名前の衝突を避けるには不要なオブジェクトをグローバルスコープに曝さなければいいんだよ
ライブラリではそのために特定の名前に全部詰め込んでそれだけをグローバルスコープに晒したりしているよ
あとはwindow.foo.barみたいに独自のネームスペースを切り出してその中だけを使うといったやり方もあるよ
javaが分かるならパッケージ名みたいなものだと言えば伝わるかな
(function(){})()の意味は無名関数の即時実行だよ
スコープの話と絡めると良くあるのは(function(global){var foo; ... global.bar=foo;})(window)みたいな使い方だよ
この例だとグローバルスコープにbarと言う名前でfooというオブジェクトを曝してるよ
あとはえーと、addEventListenerで登録するのは関数の名前じゃなくてFunctionオブジェクトそのものだよ
無名関数も登録できるよね
リスナーが実行されるときに名前で関数を探しているわけではないんだよ
791デフォルトの名無しさん
2018/05/18(金) 01:01:40.56ID:8Lfa78Q0 >>787
> 是非はともかくjQueryやlodashなんかは1文字に全てを押し込めて衝突を避けてるけど
> サイト側が$を使っちゃうとそれまでの話
jQueryもlodashも$や_をサイト側でも使っても問題ない方法を用意してるよ
jQuery.noConflict()
https://api.jquery.com/jquery.noconflict/
_.noConflict()
https://lodash.com/docs/4.17.10#noConflict
> 是非はともかくjQueryやlodashなんかは1文字に全てを押し込めて衝突を避けてるけど
> サイト側が$を使っちゃうとそれまでの話
jQueryもlodashも$や_をサイト側でも使っても問題ない方法を用意してるよ
jQuery.noConflict()
https://api.jquery.com/jquery.noconflict/
_.noConflict()
https://lodash.com/docs/4.17.10#noConflict
792デフォルトの名無しさん
2018/05/18(金) 01:04:02.60ID:QeKi0vmL 大事なことを言い忘れたよ
functionで囲うのは関数定義がスコープを生成するからだよ
functionで囲うのは関数定義がスコープを生成するからだよ
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【外交】元台湾総統・馬英九氏、高市首相発言に「台湾を危険にさらす」台湾海峡の問題は「両岸の中国人が自ら話し合うべき」★2 [1ゲットロボ★]
- 高市首相答弁を“引き出した”立民・岡田克也氏が改めて説明「なぜ慎重な答弁をされなかったのか。非常に残念に思っている」 ★8 [ぐれ★]
- 「母の部屋に安倍氏が表紙の機関誌が」「(安倍氏が被害者なのは)不思議に思いませんでした」山上被告の妹が証言 [おっさん友の会★]
- 【野球】大谷翔平、佐々木朗希、山本由伸らがWBC辞退なら広がる不協和音… 『過去イチ盛り上がらない大会』になる可能性も★2 [冬月記者★]
- 【国際】ロシアはすでに戦争準備段階――ポーランド軍トップが警告 [ぐれ★]
- 【芸能】俳優・野村宏伸 テレビドラマの制作費やギャラの現状訴え 「比べものにならない位、今は低くて…」 [冬月記者★]
- 麻生太郎「今のアメリカ政治の変化は同盟国として看過できない」 [256556981]
- 【悲報】自前で旅客機を作れる国と税金チューチューして終わった国、戦争になったらどっちが勝てると思う🤔 [616817505]
- 【愛国者悲報】中国「たとえ日本産水産物が中国に輸出されても市場は”存在しない”。いらねぇんだよジャップの水産物なんかよぉw」 [856698234]
- 【高市売り】円安、止まらず!凄い勢いで暴落中。157円へ [219241683]
- 中国外務省局長 「ポケットに手を入れていたのは寒いから」 ⬅︎これ [279254606]
- ちょっと俺のID見てくれ
