人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

<script>var escape='1000';</script> //JS1
<script>document.write(escape('ほげほげ'));</script> //JS2

上記のようにjavascriptで関数名を変数名で使ってしまった場合
関数は使えなくなると思いますが、JS1の部分は変えずにJS2の部分だけの変更で
回避させる方法はありますでしょうか?

●質問者: はるぼぼ27
●カテゴリ:インターネット ウェブ制作
✍キーワード:JavaScript js Write ほげほげ 回避
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● kn1967
●25ポイント ベストアンサー

例えば下記のような場合、

<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ふがふが」など。

◎質問者からの返答

そうですよねー

やっぱ無理ですよね

ありがとうございました。


2 ● Cherenkov
●20ポイント

うーん。状況がさっぱりわかりませんが、

JS2でescape関数と同じ関数をつくったらいいのかな・・。

<script>var escape='1000';</script>
<script>
function escape2(str) {
 return str + "!!";
}
document.write("escape: " + escape + "<br>");
document.write(escape2("escape2: " + 'ほげほげ'));
</script>
◎質問者からの返答

仰るとおり確かに不可思議な状況なのですが、簡単に言うと

前半は他人が書いた部分で変更できない(モロモロの事情で)

後半は自分が書く部分で変更できるという状況なのです。。。。

これでescape2がエンコードされればよいのですが。。


3 ● Mars
●20ポイント

escape関数が再定義されてしまって困っているなら・・・

<script>var trueEscape=escape;</script> //退避しておく
<script>var escape='1000';</script> //JS1
<script>document.write(trueEscape('ほげほげ'));</script> //JS2退避した変数で呼び出し

で、どうでしょう。

◎質問者からの返答

説明が不足していてすみません。

JS1の前は作れないのです。

でも発想の方向性は参考になりそうです。

ありがとうございます。


4 ● kebo987654
●20ポイント

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の前は作れないのです。

でも勉強になりました。

ありがとうございます。


5 ● りゅう
●20ポイント

読み込み順序が制御できるのであれば、これでどうでしょう。

<script>var escape2 = escape;</script>
<script>var escape='1000';</script>
<script>document.write(escape2('ほげほげ'));
◎質問者からの返答

説明が不足していてすみません。

順番も変更できないのです。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ