6/20/2013
5:31:00 PM 0

JavaScript 變數宣告(使用 var 與不使用 var 的區別)

JavaScript 變數使用 var 來宣告, 如果不使用 var, 則屬於 global object
a = 1; //global

function init() {
    b = 2; //global
    var c = 3; //local
}

function test1() {
    init();
 
    console.log(a); 
    console.log(b); 
    console.log(c); 
}

test1();
output
--------------------------------------------
1
2
exception : ReferenceError: c is not defined

變數宣告後在作用範圍內都有效
function test2() {
    console.log(a);
    var a = 1;
    console.log(a);
}

test2();
output
--------------------------------------------
undefined
1

注意 :
第一次 alert 時並未發生 exception, 而是輸出 undefined, 因 a 的作用範圍在 function test2 裡都有效果, a 尚未出始化, 所以輸出 undefined, 這行為稱之為提昇(Hoisting)

我們可以使用 delete 來刪除物件上的特性, 當不使用 var 宣告的變數, 就屬於 global object 中的一個特性, 相當於我們使用 delete 來刪除變數
var a = 1;
b = 2;
console.log(a);
console.log(b);
console.log(delete a);
console.log(delete b);
console.log(a);
console.log(b)
output
--------------------------------------------
1
2
false (false 表示無法刪除)
true (true 表示特性刪除成功)
1
ReferenceError: b is not defined

JavaScript 有幾個內建的 Data Types, 都可使用 var 來宣告
  1. Primary Data Types
    • String
    • Number
    • Boolean
  2. Composite Data Types
    • Object
      • Function
      • Array
      • Date
      • RegExp
    • Array
  3. Special Data Types
    • Null
    • Undefined
example :
var a;//a is undefined
var b = "test";//b is String
var c = 1;//c is a Number
var d = new Array();//d is Array
6/07/2013
3:03:00 PM 0

Service Locator Pattern

將取得服務的方法進行封裝, 可降低程式碼間的耦合度

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

public final class ServiceLocator {

 private static ServiceLocator sl = new ServiceLocator();
 private Context c;
 private Map m;

 private ServiceLocator() {
  try {
   c = new InitialContext();
   m = Collections.synchronizedMap(new HashMap());
  } catch (Exception ex) {
   throw new ExceptionInInitializerError(ex);
  }
 }

 public static ServiceLocator getInstance() {
  return sl;
 }

 public DataSource getDataSource(String name) throws NamingException {
  DataSource ds = null;

  if (m.containsKey(name)) {
   ds = (DataSource) m.get(name);
  } else {
   ds = (DataSource) c.lookup(name);
   m.put(name, ds);
  }

  return ds;
 }
}