<script>var escape='1000';</script> //JS1

<script>document.write(escape('ほげほげ'));</script> //JS2

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

回答の条件
  • 1人2回まで
  • 登録:2009/06/04 22:07:53
  • 終了:2009/06/08 12:05:20

ベストアンサー

id:kn1967 No.1

kn1967回答回数2915ベストアンサー獲得回数3012009/06/05 03:55:21

ポイント25pt

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

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

id:hrhakbn

そうですよねー

やっぱ無理ですよね

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

2009/06/05 23:21:57

その他の回答(4件)

id:kn1967 No.1

kn1967回答回数2915ベストアンサー獲得回数3012009/06/05 03:55:21ここでベストアンサー

ポイント25pt

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

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

id:hrhakbn

そうですよねー

やっぱ無理ですよね

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

2009/06/05 23:21:57
id:Cherenkov No.2

Cherenkov回答回数1502ベストアンサー獲得回数4922009/06/05 04:06:06

ポイント20pt

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

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

<script>var escape='1000';</script>
<script>
function escape2(str) {
  return str + "!!";
}
document.write("escape: " + escape + "<br>");
document.write(escape2("escape2: " + 'ほげほげ'));
</script>
id:hrhakbn

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

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

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

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

2009/06/05 23:27:58
id:Mars No.3

Mars回答回数203ベストアンサー獲得回数202009/06/06 16:02:09

ポイント20pt

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

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

で、どうでしょう。

id:hrhakbn

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

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

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

ありがとうございます。

2009/06/08 12:01:54
id:kebo987654 No.4

kebo987654回答回数38ベストアンサー獲得回数102009/06/06 19:09:16

ポイント20pt

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>
id:hrhakbn

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

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

でも勉強になりました。

ありがとうございます。

2009/06/08 12:02:45
id:rryu No.5

りゅう回答回数30ベストアンサー獲得回数22009/06/08 01:01:28

ポイント20pt

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

<script>var escape2 = escape;</script>
<script>var escape='1000';</script>
<script>document.write(escape2('ほげほげ'));
id:hrhakbn

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

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

2009/06/08 12:03:12

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません