Không, bạn không thể tạo ra chức năng như vậy. Vấn đề là điều này:
any_function(undeclared_variable)
sẽ sản xuất một ReferenceError nếu undeclared_variable
đã không công bố bất cứ nơi nào. Ví dụ: nếu bạn chạy mã độc lập này:
function f() { }
f(pancakes);
bạn sẽ nhận được tham chiếu vì pancakes
không được khai báo ở bất kỳ đâu. Demo: http://jsfiddle.net/ambiguous/wSZaL/
Tuy nhiên, typeof
operator có thể được sử dụng trên một cái gì đó mà không được công bố vì vậy đây:
console.log(typeof pancakes);
sẽ chỉ cần đăng nhập một undefined
trong giao diện điều khiển. Demo: http://jsfiddle.net/ambiguous/et2Nv/
Nếu bạn không nhớ ReferenceErrors có thể thì bạn đã có chức năng cần thiết trong câu hỏi của bạn:
function exists(obj, key) {
if (typeof obj !== "undefined" && obj !== null)
return obj[key];
return null; // Maybe you'd want undefined instead
}
hay, vì bạn không cần phải có khả năng sử dụng typeof
trên các biến chưa được khai báo ở đây, bạn có thể đơn giản hóa nó xuống:
function exists(obj, key) {
if(obj != null)
return obj[key];
return null;
}
Lưu ý sự thay đổi để !=
, undefined == null
là đúng mặc dù không phải là undefined === null
.
Nguồn
2013-06-27 16:50:29
Đối với một điều này sẽ cần getters mục đích chung ('definegetter (o, chức năng (tài sản) {...})', đó là, nếu tôi nhớ correclty, không nằm trong đặc điểm kỹ thuật của JavaScript. – Zeta
@Zeta Không thực sự, vì việc truy cập một thuộc tính không tồn tại của một đối tượng trả về 'undefined' thay vì thất bại, nên đủ tốt – millimoose
Gần nhất tôi có thể nghĩ là' hàm tồn tại (obj) {if (obj) return obj; return {}; } ', nhưng điều đó sẽ không xử lý các biến không xác định. Javascript không phải là cú pháp có thể mở rộng theo cách đó. – millimoose