JavaScriptの中で誤解されやすい二つのところ
3891 ワード
JavaScriptの中で誤解されやすい二つのところ
1. jsにおける変数のスコープ(Varable Scope)
java、c++の違いは、jsにブロックスコープがないということです。変数のスコープは宣言からfunctionの末尾まで続きます。例を見れば分かります。
function testScope()
{
var a="a"
function g(){alert(a)}
g() // ここでの出力結果はaです。aの作用領域はfunctionに続きます。 testScopeの最後
for(var i=0;i<2;i+)
{
var a="a is changed" // ここの変数aは、開始宣言の変数aを上書きします。
var b="b" //bのスコープは声明からfunctionの末尾までです。
}
alert(a) // 出力結果は a is changed、jsがまず検索したaはサイクル中に定義されたそれです。
alert(b) // 出力はbです javaでは変数bにはアクセスできません。bは既にアクティブドメインですが、jsでは可能です。
}
2.jsのゴミ回収(garbage collection)
jsもゴミ回収の仕組みを採用した言語で、javaと同じです。jsの解釈器はメモリの割り当てと回収を担当しています。
プログラマは、C+++のように手動でメモリをdeleteで放出する必要がない。
しかし、jsにもdeleteキーワードがあります。オブジェクトの属性を削除するか、配列内の指定要素を削除するために使われます。オブジェクト自体を削除することはできません。使い方は以下の通りです。
構文
delete object Name.propertydelete object Name[index]delete property
パラメータ
object Name
属性または要素のオブジェクトを削除します。
property
削除する属性。
index
削除する配列要素の番号。
第三の用法delete propertyはwith文でしか使用できません。対象の属性を削除するために使用します。補足:マイクロソフトのJScriptにはCollectGarbage関数があります。メモリを回収するために使用できます。公式文書はこの方法を推奨しません。あなたのプログラムはこの方法に依存するべきではありません。IEは最小化時にメモリを回収します。:34 コメントを追加します。 固定リンク 引用通告(0) レコード ajax 固定リンク
http://magicdoom.spaces.live.com/blog/cns!94854 BA 5 F 2 AB 4 D 46!113.entry
コメントを追加
JavaScriptの中の伝値と引用
1.伝値(by value)
変数の値はコピーされます。元の値とは関係なく、つまり新しい値が修正されても元の値は変わりません。JavaScriptでは基本的なタイプはすべて送信値です。
function testPassValue()
{
var m=1
var n=2
// m,nの値をコピーして、passValueに送ります。
passValue(m,n)
alert(m) // 元の値になります。
)
function passValue(a,b)
{
a=a+b;//aの値を変えて、ここaは元の値の一つのcopyだけです。
alert(a)
参照自体がコピーされてFunctionに渡され、参照先は複製されていません。functionでは、オブジェクトの属性の値が変更されたら、元の参照先と同じオブジェクトですので、元の参照からアクセスするのは修正された値です。
ただし、functionで参照が新しいオブジェクトを指すだけであれば、元のオブジェクトの値は変更されません。変更されたのはコピーされたこの参照のみです。
function testPassValue()
{
var date=new Date(2006,02,27);
alert(date.get Date); // 出力は27です
// date引用自体をコピーし、passReferenceに伝え、dateが指す対象がコピーされていないことに注意する。
passReference(date);
alert(date.get Date); // 出力は12です
// 同上
change Reference(date);
alert(date.get Date); // 出力はまだ12です
)
function passReference(da)
{
// daと元の参照は同じオブジェクトを指すので、functionの外で元の参照によって訪問したのは対象の日付属性値です。修正後の値です。
da.set Date(12)
)
function change Reference(da)
{
// この場合、da引用は実際に元の引用の一つのcopyであり、引用自体が再割当され、元の参照に影響を与えない。
da=new Date(2007,05,11);
//daを新しいオブジェクトに参照する場合、元の参照が元のオブジェクトですか?
alert(da.get Date(); // 出力は11です
)
3特殊なString
JavaScriptでは、Stringも引用しています。jsにはcharAt方法しかありません。対応する修正方法がなく、javaのStringと同じです。
var s 1=「ハロー」
var s 2="hell"+"o"
if(s 1==s 2)
alert(“s 1=s 2”); // この文は実行できますか?java用の熟している人は実行できないと思うかもしれません。java中の==比較は同じです。実際にjsでString==比較するのは値が同じかどうかです。この文は実行されますが、他のObject==比較はjava中と同じです。
posted on 2006-08-30 09:36貧乏人読書(242)評論(0) 編集 コレクション
1. jsにおける変数のスコープ(Varable Scope)
java、c++の違いは、jsにブロックスコープがないということです。変数のスコープは宣言からfunctionの末尾まで続きます。例を見れば分かります。
function testScope()
{
var a="a"
function g(){alert(a)}
g() // ここでの出力結果はaです。aの作用領域はfunctionに続きます。 testScopeの最後
for(var i=0;i<2;i+)
{
var a="a is changed" // ここの変数aは、開始宣言の変数aを上書きします。
var b="b" //bのスコープは声明からfunctionの末尾までです。
}
alert(a) // 出力結果は a is changed、jsがまず検索したaはサイクル中に定義されたそれです。
alert(b) // 出力はbです javaでは変数bにはアクセスできません。bは既にアクティブドメインですが、jsでは可能です。
}
2.jsのゴミ回収(garbage collection)
jsもゴミ回収の仕組みを採用した言語で、javaと同じです。jsの解釈器はメモリの割り当てと回収を担当しています。
プログラマは、C+++のように手動でメモリをdeleteで放出する必要がない。
しかし、jsにもdeleteキーワードがあります。オブジェクトの属性を削除するか、配列内の指定要素を削除するために使われます。オブジェクト自体を削除することはできません。使い方は以下の通りです。
構文
delete object Name.propertydelete object Name[index]delete property
パラメータ
object Name
属性または要素のオブジェクトを削除します。
property
削除する属性。
index
削除する配列要素の番号。
第三の用法delete propertyはwith文でしか使用できません。対象の属性を削除するために使用します。補足:マイクロソフトのJScriptにはCollectGarbage関数があります。メモリを回収するために使用できます。公式文書はこの方法を推奨しません。あなたのプログラムはこの方法に依存するべきではありません。IEは最小化時にメモリを回収します。
http://magicdoom.spaces.live.com/blog/cns!94854 BA 5 F 2 AB 4 D 46!113.entry
コメントを追加
JavaScriptの中の伝値と引用
1.伝値(by value)
変数の値はコピーされます。元の値とは関係なく、つまり新しい値が修正されても元の値は変わりません。JavaScriptでは基本的なタイプはすべて送信値です。
function testPassValue()
{
var m=1
var n=2
// m,nの値をコピーして、passValueに送ります。
passValue(m,n)
alert(m) // 元の値になります。
)
function passValue(a,b)
{
a=a+b;//aの値を変えて、ここaは元の値の一つのcopyだけです。
alert(a)
}
:
3
1
2.引用(by reference)参照自体がコピーされてFunctionに渡され、参照先は複製されていません。functionでは、オブジェクトの属性の値が変更されたら、元の参照先と同じオブジェクトですので、元の参照からアクセスするのは修正された値です。
ただし、functionで参照が新しいオブジェクトを指すだけであれば、元のオブジェクトの値は変更されません。変更されたのはコピーされたこの参照のみです。
function testPassValue()
{
var date=new Date(2006,02,27);
alert(date.get Date); // 出力は27です
// date引用自体をコピーし、passReferenceに伝え、dateが指す対象がコピーされていないことに注意する。
passReference(date);
alert(date.get Date); // 出力は12です
// 同上
change Reference(date);
alert(date.get Date); // 出力はまだ12です
)
function passReference(da)
{
// daと元の参照は同じオブジェクトを指すので、functionの外で元の参照によって訪問したのは対象の日付属性値です。修正後の値です。
da.set Date(12)
)
function change Reference(da)
{
// この場合、da引用は実際に元の引用の一つのcopyであり、引用自体が再割当され、元の参照に影響を与えない。
da=new Date(2007,05,11);
//daを新しいオブジェクトに参照する場合、元の参照が元のオブジェクトですか?
alert(da.get Date(); // 出力は11です
)
3特殊なString
JavaScriptでは、Stringも引用しています。jsにはcharAt方法しかありません。対応する修正方法がなく、javaのStringと同じです。
var s 1=「ハロー」
var s 2="hell"+"o"
if(s 1==s 2)
alert(“s 1=s 2”); // この文は実行できますか?java用の熟している人は実行できないと思うかもしれません。java中の==比較は同じです。実際にjsでString==比較するのは値が同じかどうかです。この文は実行されますが、他のObject==比較はjava中と同じです。
posted on 2006-08-30 09:36貧乏人読書(242)評論(0) 編集 コレクション