2012-02-09 23 views
7

Tôi tự hỏi liệu điều này có thể xảy ra hay không. Về cơ bản tôi có một vài đối tượng mà tôi vượt qua một chức năng, và trong điều kiện nhất định tôi muốn rằng chức năng để thiết lập các đối tượng để null.JavaScript - Làm cách nào/Tôi có thể đặt tham chiếu đối tượng thành null từ một hàm không?

Ví dụ:

var o = {'val' : 0}; 

f = function(v) 
{ 
    v = null; 
}; 

f(o); // Would like this to set 'o' to null 

Thật không may có vẻ như tôi chỉ có thể đặt đối số của hàm thành null. Sau khi gọi hàm 'o' sẽ vẫn đề cập đến một đối tượng.

Vì vậy, thậm chí có thể thực hiện việc này không? Và nếu vậy, làm thế nào?

Trả lời

7

Nếu bạn muốn thay đổi giá trị của o khi f(o) được gọi, bạn có hai lựa chọn :

1) Bạn có thể có f(o) trả về một giá trị mới cho o và gán đó để o như thế này:

var o = {'val' : 0}; 
o = f(o); 
// o == null 

Bên f(), bạn trả về một giá trị mới cho o.

2) Bạn đặt o vào đối tượng khác và chuyển tham chiếu đến đối tượng chứa đó vào f().

function f(v) { 
    if (whatever) { 
     v.o = null; 
    } 
} 

var c = {}; 
c.o = {'val' : 0}; 

f(c); 
// c.o == null; 

Ngôn ngữ javascript không có con trỏ đích thực như trong C/C++ cho phép bạn chuyển con trỏ tới biến và sau đó quay lại con trỏ để thay đổi giá trị của biến đó từ bên trong hàm. Thay vào đó, bạn phải thực hiện một trong hai cách khác. Các đối tượng và mảng được truyền qua tham chiếu để bạn có thể quay lại đối tượng gốc từ hàm.

2

Không chắc chắn chính xác việc sử dụng thực tế của điều này, nhưng nếu bạn tái cơ cấu một chút, bạn có thể làm điều này:

var o = {'val' : 0}; 

var f = function(v) 
{ 
    if(something){ 
     return null; 
    }else{ 
     return v; 
    } 
}; 

o = f(o); 
2

JavaScript luôn chuyển đối số hàm "theo giá trị". Có nghĩa là một hàm không thể thay đổi biến mà bên ngoài hàm trỏ tới.

Tuy nhiên, khi bạn chuyển đối tượng vào hàm, "giá trị" được chuyển là tham chiếu đến đối tượng thực tế, chứ không phải bản sao của đối tượng. Vì vậy, mặc dù bạn không thể đặt biến bên ngoài thành null hoặc đối tượng khác, bạn có thể sửa đổi nội dung của đối tượng đó. Có nghĩa là bạn có thể làm một cái gì đó như thế này:

var containerObj = {'o' : {'val' : 0} }; 

f = function(v) { 
    v.o = null; 
}; 

f(containerObj.o); // This property would be set to null successfully. 

Rõ ràng tạo ra một loạt các đối tượng chứa chỉ để bạn có thể vượt qua họ để chức năng không phải là rất đẹp, nhưng nó là một cách để làm điều đó.

Nhưng tôi khuyên bạn nên đi với đề xuất của James Montagne có chức năng trả về một đối tượng hoặc null và gán kết quả lại cho biến của bạn.

1

Tôi đến đây với cùng một vấn đề. Mặc dù các câu trả lời wrapper hoạt động, nó xấu xí, và chức năng của tôi là không đồng bộ, vì vậy tôi không thể trả về một giá trị null.

Lý do tôi muốn onull là sau này tôi sử dụng if (o) //do something, đó có thể là lý do tại sao OP và những người khác muốn thiết lập nó như null.Như vậy, giải pháp của tôi, mặc dù không phải là một câu trả lời cho câu hỏi chính xác, là

var o = {'val' : 0}; 
f = function(v) { 
    v.isNull = true; 
} 
if (!o.isNull) // do something 
0

Cách đơn giản nhất để làm việc đó sẽ tạo ra một biến toàn cầu gọi là NULL và đặt nó để null

var NULL = null 

Sau đó, bạn có thể đặt một biến hiện có thành NULL mà không sửa đổi đối tượng gốc.

var NULL = null; 
var original = {}; 
var ptr = original; 
ptr = NULL; 
console.log("original is not null = " + (original!==null)); 
console.log("ptr is null = " + (ptr===null)); 
Các vấn đề liên quan