2012-03-16 21 views
29

Tôi có một chức năng dọc theo dòng trong các cách sau:thể 'này' bao giờ được null trong Javascript

doSomething: function() { 
     var parent = null; 

     if (this === null) { 
      parent = 'some default value'; 
     } else { 
      parent = this.SomeValue(); 
     } 
    } 

thể cha mẹ bao giờ được đặt thành 'một số giá trị mặc định' hoặc là séc for null thừa ?

Ngoài ra, những gì nếu tôi sử dụng ít hạn chế:

doSomething: function() { 
     var parent = this ? this.SomeValue() : 'some default value'; 
    } 

thể cha mẹ bao giờ được đặt thành 'một số giá trị mặc định' trong trường hợp này?

Trả lời

36

Ở chế độ không nghiêm ngặt, this đã trải qua quá trình chuyển đổi Object(this), do đó, nó luôn luôn trung thực. Các ngoại lệ là nullundefined ánh xạ tới đối tượng chung. Vì vậy, this là không bao giờ null và luôn luôn trung thực, làm cho cả hai kiểm tra thừa.

Ở chế độ nghiêm ngặt, tuy nhiên, this có thể là bất kỳ thứ gì trong trường hợp đó bạn phải xem. Nhưng sau đó một lần nữa bạn phải lựa chọn cho chế độ nghiêm ngặt chính mình, vì vậy nếu bạn không làm điều đó không có lo lắng.

(function() {    return this; }).call(null); // global object 
(function() { "use strict"; return this; }).call(null); // null 

Các specification của ES5 nói:

Giá trị thisArg được truyền mà không sửa đổi như giá trị này. Đây là một thay đổi từ phiên bản 3, trong đó một không xác định hoặc null thisArg được thay thế bằng đối tượng toàn cầuToObject được áp dụng cho tất cả các giá trị khác và kết quả đó được chuyển làm giá trị này.

+0

Cần lưu ý rằng cố gắng để gọi là "someValue()" chức năng trên một đối tượng mà không có một tài sản đó có thể là nguyên nhân cho một * ít * lo lắng. – Pointy

+0

Vâng, về mặt kỹ thuật, nó không phải lúc nào cũng trải qua 'Object (this)', vì nếu nó là một đối tượng, nó không, và quan trọng hơn, nếu nó ban đầu là 'null' hoặc' undefined' thì nó không , nó chỉ được đặt trực tiếp vào đối tượng chung. – davin

+0

@davin: Trên thực tế đối với một đối tượng, nó không quan trọng cho dù nó ('Object (obj) === obj'), nhưng đối với điểm thứ hai của bạn, bạn hoàn toàn chính xác. – pimvdb

2

Mặc dù không phải là câu trả lời trực tiếp cho câu hỏi của bạn .. trong trình duyệt 'này', theo mặc định, hãy tham khảo đối tượng 'cửa sổ'. Trên nodejs nó sẽ tham chiếu đến đối tượng chung.

Tôi không chắc liệu có trường hợp nào có thể là null hay không, nhưng ít nhất cũng là điều bất thường.

+0

Welp .. Tôi sẽ để lại câu trả lời của tôi bởi vì nó có thể hữu ích, nhưng pimvdb có câu trả lời tốt hơn :) – Evert

2

Từ khóa this không được rỗng, nhưng có thể không phải là những gì bạn mong đợi. Bạn có thể kết thúc tham chiếu đối tượng window nếu bạn không cẩn thận.

Trong trường hợp của bạn, tôi tin rằng this nên tham chiếu đến hàm doSomething.

var myObject = { 
    myMethod: function() { 
     console.log(this); 
    } 
}; 

myObject.myMethod(); // prints out a reference to the myMethod function 

Đây là jsFiddle.

0

No. Giá trị this sẽ không bao giờ là văn bản 'some default value'.

0

this không thể rỗng. nếu nó là null, thì bạn không thể ở trong phạm vi phương thức.

1

Bạn có thể thấy điều gì xảy ra nếu bạn cố gắng buộc Javascript sử dụng phạm vi không trong bất kỳ trình duyệt nào.Tôi đã thực hiện một ví dụ ở đây:

http://jsfiddle.net/rXsWj/

Nói tóm lại, đây thực nghiệm chứng minh rằng những thay đổi trình duyệt 'null' để 'cửa sổ' khi đang bay. Nếu thay vào đó bạn thay đổi null thành 'a', bạn sẽ thấy cảnh báo 'a' như bạn mong đợi. Mã số từ liên kết như tài liệu tham khảo:

function a() { 
    alert(this) 
} 

a.apply(null) 

Các vấn đề liên quan