<script>document.write(escape('ほげほげ'));</script> //JS2
上記のようにjavascriptで関数名を変数名で使ってしまった場合
関数は使えなくなると思いますが、JS1の部分は変えずにJS2の部分だけの変更で
回避させる方法はありますでしょうか?
例えば下記のような場合、
<html> <head> <script type="text/javascript">function escape(t){return(t + t);}</script> </head> <body> <p>(1)<script type="text/javascript">document.write(escape('ほげほげ'));</script></p> <p>(2)<script type="text/javascript">var escape='1000';</script></p> <p>(3)<script type="text/javascript">document.write(escape('ほげほげ'));</script></p> </body> </html>
(1)の時点ではescapeという名の関数が存在するので表示される
(2)の時点ではescapeという名の関数は無くなって、escapeという名の変数がセットされる
(3)の時点ではescapeという名の関数は既に無い。
関数も変数も同列に名前だけで管理されているので
これの回避策は残念ながらありません。
関数名や変数名などが重ならないように
命名規則を作って対処していく事などを検討してみてください。
例えば、関数名は「fnほにゃらら」変数名は「strほげほげ」「intふがふが」など。
例えば下記のような場合、
<html> <head> <script type="text/javascript">function escape(t){return(t + t);}</script> </head> <body> <p>(1)<script type="text/javascript">document.write(escape('ほげほげ'));</script></p> <p>(2)<script type="text/javascript">var escape='1000';</script></p> <p>(3)<script type="text/javascript">document.write(escape('ほげほげ'));</script></p> </body> </html>
(1)の時点ではescapeという名の関数が存在するので表示される
(2)の時点ではescapeという名の関数は無くなって、escapeという名の変数がセットされる
(3)の時点ではescapeという名の関数は既に無い。
関数も変数も同列に名前だけで管理されているので
これの回避策は残念ながらありません。
関数名や変数名などが重ならないように
命名規則を作って対処していく事などを検討してみてください。
例えば、関数名は「fnほにゃらら」変数名は「strほげほげ」「intふがふが」など。
そうですよねー
やっぱ無理ですよね
ありがとうございました。
うーん。状況がさっぱりわかりませんが、
JS2でescape関数と同じ関数をつくったらいいのかな・・。
<script>var escape='1000';</script> <script> function escape2(str) { return str + "!!"; } document.write("escape: " + escape + "<br>"); document.write(escape2("escape2: " + 'ほげほげ')); </script>
仰るとおり確かに不可思議な状況なのですが、簡単に言うと
前半は他人が書いた部分で変更できない(モロモロの事情で)
後半は自分が書く部分で変更できるという状況なのです。。。。
これでescape2がエンコードされればよいのですが。。
escape関数が再定義されてしまって困っているなら・・・
<script>var trueEscape=escape;</script> //退避しておく <script>var escape='1000';</script> //JS1 <script>document.write(trueEscape('ほげほげ'));</script> //JS2退避した変数で呼び出し
で、どうでしょう。
説明が不足していてすみません。
JS1の前は作れないのです。
でも発想の方向性は参考になりそうです。
ありがとうございます。
JS1の前でescape関数への参照を保存しておくという手があります。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html lang="ja"> <head> <meta http-equiv="content-type" content="text/html; charset=Shift_JIS"> <meta http-equiv="content-script-type" content="text/javascript"> <title></title> <script type="text/javascript"><!-- var nativeFuncs={}; (function(nativeFuncs){ var list=["escape"]; //参照を保存したい関数の名前リスト for(var i=0,l=list.length;i<l;++i) nativeFuncs[list[i]]=this[list[i]]; })(nativeFuncs); --></script> <script type="text/javascript"><!-- var escape="1000"; --></script> <script type="text/javascript"><!-- document.write(nativeFuncs.escape("ほげほげ"));//保存した関数はnativeFuncs.(名前)でとりだせる。 --></script> </head> <body> </body> </html>
説明が不足していてすみません。
JS1の前は作れないのです。
でも勉強になりました。
ありがとうございます。
読み込み順序が制御できるのであれば、これでどうでしょう。
<script>var escape2 = escape;</script> <script>var escape='1000';</script> <script>document.write(escape2('ほげほげ'));
説明が不足していてすみません。
順番も変更できないのです。
そうですよねー
やっぱ無理ですよね
ありがとうございました。