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)  
    
    										}
    								
    
    										    :
    								
    
    										
    												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)  編集  コレクション