- + JavaScript の質問用スレッド vol.125 +
774 :デフォルトの名無しさん[sage]:2018/05/17(木) 10:27:39.72 ID:X1pFA/4b - どうにもわからないことがあります
例えばHTMLの中に<a onclick="hoge()">と書いてあるとして そのhoge関数はどのスクリプトにあるhoge()が呼ばれるんでしょうか?ブラウザでは同時にいくつものjavascriptが走っていると思うんですが 試しにGreasemonkeyでスクリプトfugaを作りそこからHTMLの適当な要素にonclick="hoge()"を追記して発火させてみると ちゃんとGreasemonkey下のfugaスクリプト内のhoge()が呼ばれますが ブラウザはどうしてhoge関数がGreasemonkey下のfugaスクリプト内にあると分かるんでしょうか? 動いている全てのスクリプトの関数名を走査しているんでしょうか だとしたらhoge()とたまたま同名の関数が他のスクリプトにあったらどっちにいってしまうのか 確実にfuga内のhoge関数を呼ぶようにonclickに指定する方法はないのか が分かりません…
|
- + JavaScript の質問用スレッド vol.125 +
776 :774[sage]:2018/05/17(木) 12:03:22.10 ID:X1pFA/4b - >>775
レスありがとうございます 他のタブの関数が呼ばれてしまうということは心配していないのですが 同じ1つのタブの中でもサイト作者が作ったJS、ブラウザアドオンのJS、GreasemonkeyのJS、と複数走っていますよね? そこで同名の関数があったらどうなるんでしょう? また確実に自分のスクリプトの中の関数を呼ぶ方法があれば知りたいです またmin()とかmax()みたいにごく短くてありふれた名前の下位関数を作ることはよくあると思うんですが 関数名がブラウザには全部一緒くたに記憶されているんだとしたらそれすらも危険という気がしてきました 自作スクリプト全体を(function(){…})()で包んだとしても、先程の例のhoge()が呼べてしまうので やはりmin()やmax()も宣言すれば全体から見えてしまう(上書きしている?)のでしょうか?
|
- + JavaScript の質問用スレッド vol.125 +
779 :774[sage]:2018/05/17(木) 14:00:11.16 ID:X1pFA/4b - >>777-778
ありがとうございます そこで最初の疑問になるのですが Greasemonkeyやブラウザアドオンのjsからdocumentの要素にonclick="hoge()"等と書き加えた場合、 いざページを見ていてユーザーがその要素をクリックした時は、ブラウザからはHTML(DOM)だけを見ているのであれば hoge()がどこのスクリプトから書き加えられたか分からない(どのスコープのその関数を呼べばいいか分からない)と思うのです。 その時でもなぜちゃんとhoge()が呼ばれるのかしっくりきません また確実に自分のスクリプトを呼ばせる方法が知りたいです
|
- + JavaScript の質問用スレッド vol.125 +
783 :774[sage]:2018/05/17(木) 22:40:53.71 ID:X1pFA/4b - ありがとうございます
まとめて書きます ファイルA.jsとファイルB.jsの作者がまったく別の人でお互いの内容を知らず、 まず順番が来たファイルAがbuttonのonclickにhoge関数を追加してhoge関数の本体も定義、 次に順番が来たファイルBがimgのonclickに(たまたま同名の)hoge関数を追加してhoge関数の本体も定義した(内容は全くの別物)という場合、 buttonやimgをクリックした時にファイルAのhoge本体とファイルBのhoge本体のどちらが呼ばれるのか?という問題が分からないのです 関数名はグローバルスコープで全て共有されるとしたら後で定義したほうが勝ちになるというのは分かるのですが だとするとスクリプト全体を(function(){…})()で包むということの意味は何になるのでしょうか? 包んだ変数名や関数名をグローバルスコープから隠すことだと思っていたのですが
|
- + JavaScript の質問用スレッド vol.125 +
786 :774[sage]:2018/05/17(木) 22:56:03.69 ID:X1pFA/4b - ↑の補記
話を具体的にするために言い換えますと、 仮にファイルAはウェブサイト側のjs、ファイルBはブラウザアドオンのjsだとします ブラウザアドオン側のjsの作者は、ウェブサイト側のjsで作って使っている関数名を全て調べて知っておく(そして衝突を避ける) なんてことをするのは現実的ではないと思うのですが どうやって衝突を避けるのでしょう? という疑問なのです ファイルAのjs内で呼び合っている関数ならスコープで保護されるのは分かるのですが HTML(DOM)のonclick等に書いてしまった場合スコープ情報が抜け落ちるような気がするのです 細かい話ですが、要素のaddEventListenerに登録する場合も、そのまま関数名だけならスコープ情報を登録してくれそうな気がしますが 関数に引数を渡したくてaddEventListener("click","function(){hoge(a,b,c)}",false)のように登録してしまった場合はやはりスコープ情報が抜け落ちそうな気がするのですが そんなことはないのでしょうか?
|