2009-06-16 42 views
10

Tôi đến từ một nền Java, với mô hình kế thừa dựa trên lớp học của nó, cố gắng để có được đầu của tôi xung quanh mô hình kế thừa dựa trên nguyên mẫu của Javascript. Một phần của những gì đang ném tôi đi, tôi nghĩ rằng tôi có ý nghĩa của Java về "điều này" vững chắc trong tâm trí - và "cái này" của Javascript là một con thú rất khác. Tôi hiểu rằng "điều này" của Javascript luôn đề cập đến người gọi của hàm, không phải là phạm vi trong đó hàm được định nghĩa - ý tôi là, tôi đã đọc và hiểu một cách bề ngoài ý nghĩa của nó. Nhưng tôi muốn có sự hiểu biết sâu sắc hơn, và tôi nghĩ có một tên khác cho nó sẽ giúp ích. Bạn nghĩ thế nào về JS "cái này"? Bạn có thực hiện một sự thay thế tinh thần mỗi khi bạn chạy qua nó? Nếu vậy - bạn sử dụng từ hoặc cụm từ nào?Điều gì sẽ là một tên tốt hơn cho "điều này" của Javascript?

+0

Lúc đầu câu hỏi có vẻ ngớ ngẩn, nhưng sau khi đọc một số câu trả lời, nó khá thú vị thực sự ;-) +1 –

Trả lời

17

this có thể được đổi tên một cách hợp lý để context trong Javascript. Nó thực sự đề cập đến một bối cảnh thực hiện cho phạm vi hiện tại, và trong khi bối cảnh đó có thể là một thể hiện của một lớp, nó chắc chắn không phải là — nó có thể là bất kỳ đối tượng nào, và nó có thể được sửa đổi tại thời gian chạy.

Chứng minh rằng không có đảm bảo nào rằng một "phương pháp" trong Javascript đang hoạt động trên một thể hiện của các "lớp học", trong đó nó được định nghĩa:

function Cat(){ 

    this.texture = 'fluffy'; 

    this.greet = function(){ 
     alert("Pet me, I'm " + this.texture); 
    } 
} 

var cat = new Cat(); 

// Default to using the cat instance as the this pointer 
cat.greet(); // Alerts "Pet me, I'm fluffy" 

// Manually set the value of the this pointer! 
cat.greet.call({texture: 'scaly'}); // Alerts "Pet me, I'm scaly" 

Điều quan trọng cần lưu ý đó mà giá trị đối tượng this hoàn toàn độc lập với vị trí hàm chứa được xác định.

+0

Vì vậy, có thể nói rằng từ khóa "này" cho phép mô phỏng phạm vi động trong javascript ?. (Nói chung tất cả các chức năng được cho là có phạm vi từ vựng/tĩnh) – techzen

5

Tôi nghĩ JavaScript của this gần hơn với Java this hơn bạn nghĩ. Trong ngữ cảnh OOP, this có nghĩa là "trường hợp này". Tôi nghĩ điều có thể gây nhầm lẫn về từ khóa this của JavaScript là nó có thể có ý nghĩa khác nhau tùy thuộc vào ngữ cảnh.

+0

"này" không phải lúc nào cũng có nghĩa là "trường hợp này". Ví dụ, bạn có thể tự thiết lập giá trị của "này" cho bất kỳ chức năng bằng cách sử dụng Function.call hoặc Function.apply. – Triptych

+0

Phải, vì vậy "điều này" có nghĩa là "trường hợp này" cho đến khi bạn thay đổi nó. Điều đó không thay đổi ý nghĩa ban đầu của "điều này".Vì vậy, tôi an toàn để giả định rằng bạn đồng ý với tôi rằng "điều này" là rất theo ngữ cảnh? –

+1

Bạn thực sự phải tin tưởng rằng 'this' đang được thiết lập đúng bởi người gọi. Giống như trong mục tiêu-c Tôi tin rằng 'tự' thực sự là ví dụ hiện tại. Trong Java bạn không thể thay đổi 'this' để trỏ đến cái gì khác. – Kekoa

1

Làm thế nào về 'JavaScript này'? Nó sẽ giữ cho bạn gắn liền trực tiếp với những gì bạn đang làm và cũng cung cấp lời nhắc nhở về tinh thần rằng khái niệm 'cái này' mà bạn đang làm việc hiện nay là khái niệm JavaScript.

Cuối cùng, tôi hy vọng bạn sẽ ngừng gọi nó là 'JavaScript này' và chỉ gọi nó là 'this', được nhận thức đầy đủ về điều đó có nghĩa là trong bối cảnh bạn đang làm việc. có lẽ bạn muốn đến đâu.

+0

Đúng. Với lời xin lỗi đến Thiền: Trước khi bạn đã học Javascript, núi là núi; nước là nước. Khi tôi học Javascript, núi không còn là núi và nước nữa, không còn nước nữa. Một khi tôi đã làm chủ được Javascript, những ngọn núi lại một lần nữa là núi và vùng biển. –

3

this không phải là người gọi hàm (mặc dù có thể là) hoặc phạm vi trong đó hàm được xác định (mặc dù có thể) - đó là ngữ cảnh của hàm.

Ý nghĩa dịch chuyển mà @Andrew Hare đề cập có thể gần với nguồn gốc của sự nhầm lẫn của bạn; vì cơ chế thừa kế nguyên mẫu của JS, từ khóa function có thể có nghĩa là, tùy thuộc vào cách nó được sử dụng, một cái gì đó gần hơn với định nghĩa phương thức Java của class.

Giả sử thực hiện trong trình duyệt:

var q = this.document; //this is window 

var o = new (function pseudoconstructor(){ 
    this.property = "something else" //the new keyword changed 'this' to mean 'the object I'm about to return' 
})(); 
9

Một tên thay thế có thể là owner. Điều này sẽ dẫn đầu tâm trí của bạn theo hướng mà chủ sở hữu có thể thay đổi tùy thuộc vào mã bạn đang thực thi.

Ví dụ này là từ quirksmode:

Trong JavaScript this luôn đề cập đến “chủ sở hữu” của hàm chúng ta đang thực hiện, hay đúng hơn, để các đối tượng đó một chức năng là một phương pháp. Khi chúng ta định nghĩa hàm trung thành của chúng ta doSomething() trong một trang, chủ sở hữu của nó là trang, hay đúng hơn là đối tượng cửa sổ (hoặc đối tượng toàn cục) của JavaScript. Tuy nhiên, thuộc tính onclick được sở hữu bởi phần tử HTML thuộc về.

Trong đoạn mã sau,

function doSomething() { 
    this.style.color = '#cc0000'; 
} 

element.onclick = doSomething; 

, owner điểm để các đối tượng có chứa phương pháp này khi nó được thực thi.

------------ window -------------------------------------- 
|          /\   | 
|           |   | 
|           this   | 
| ----------------      |   | 
| | HTML element | <-- this   ----------------- | 
| ----------------  |   | doSomething() | | 
|    |   |   ----------------- | 
|   --------------------       | 
|   | onclick property |       | 
|   --------------------       | 
|              | 
---------------------------------------------------------- 
+1

Tôi đã không downvote (chưa), nhưng tôi không thích câu trả lời này, bởi vì nó dẫn một người tin rằng giá trị của con trỏ này là "luôn luôn" được xác định bởi vị trí hàm được xác định, điều này hoàn toàn không đúng sự thật. – Triptych

0

tôi hấp thụ cú pháp tiểu thuyết với chút dễ loại mô hình trí tuệ như:

$(document).ready(function() { 

    function baffle() { 
    alert(this.b); 
    } 

    function what() { 
    this.b = "Hello"; 
    baffle(); 
    } 

    function huh() { 
    this.b = "World"; 
    baffle(); 
    } 

    what(); 
    huh(); 

    } 
); 

này nặng-chuyển thành luộm thuộm, tưởng tượng C++ như:

template <class This> 
function baffle() { 
    alert(This.b); 
} 

function what() { 
    b = "Hello"; 
    baffle<what>(); 
} 

function huh() { 
    b = "World"; 
    baffle<huh>(); 
} 

what(); 
huh(); 
0

Tôi nghĩ this phù hợp nhất với lý do lịch sử. Không có cụm từ một kích thước phù hợp cho this trong JavaScript, vì nó không chỉ được gán tự động cho các tham chiếu rất khác, ví dụ: this trong ngữ cảnh của hàm thủ tục hoặc this trong ngữ cảnh của đối tượng , nhưng this cũng có thể được chỉ định bởi người viết kịch bản sử dụng Function.applyFunction.call.

Tuy nhiên, ý nghĩa của this chỉ có thể điều chỉnh vì JavaScript và DOM hoạt động theo một số cách rất lạ. Ví dụ, việc sử dụng chính của Function.apply là để bảo vệ bối cảnh của tham chiếu phần tử trong các cuộc gọi sự kiện. Bạn sẽ thấy điều này trong phương pháp Function.bind() của Prototye.

this là trình giữ chỗ cho ngữ cảnh trong đó chức năng đang được thực thi và khó có thể cụ thể hơn điều đó. Tuy nhiên, hầu hết việc sử dụng số this làm cho nó trở thành một từ khóa thích hợp ngữ nghĩa. Trong trường hợp của bind(), mặc dù chúng tôi đang sử dụng các phương pháp để tự ý thay đổi ý nghĩa của this trong hàm, nó nên được sử dụng để làm cho this phù hợp hơn là không có. Nhiều lập trình viên JavaScript nghiệp dư bị ném đi bởi hành vi kỳ lạ của this trong trình xử lý sự kiện và Function.apply được sử dụng để đúng là "sai".

-1

Logic tự tương tự (tự hay điều này) tránh nghịch lý để lợi thế làm việc ngoài khác với bản thân (điều này). Sẽ tự (điều này) giữ tất cả mọi thứ và tất cả để một, nó cũng có thể ở tĩnh không có ví dụ và với phương pháp lớp (tĩnh) để thay thế. Để tránh những nghịch lý, tránh các selfreferences và logic giữ tất cả các sự thật có thể chứng minh và viceversa, tất cả các provables đúng sự thật.

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