2015-06-11 18 views
5

Trong JavaScript, nếu bạn đặt một số loại biểu thức ở phía bên trái của một biểu thức gán, công cụ sẽ ném một tham chiếu. Ví dụ,JavaScript có khái niệm giá trị l và giá trị r không?

// 'this' on the left side 
this = window; // ReferenceError: Invalid left-hand side in assignment 

hoặc

// function call expression on the left side 
var a; 
var fn = function() {return a}; 
a === fn(); // true 
a = 1; // 1 
fn() = 5; // ReferenceError: Invalid left-hand side in assignment 

hoặc

var a; 
a = 1; // 1 
(a) = 2; // 2 
(1, a) = 3; // ReferenceError: Invalid left-hand side in assignment 

Câu hỏi của tôi là:

  1. Liệu JavaScript cũng có khái niệm về l-giá trị và r- giá trị như C?

  2. Tại sao biểu thức cuộc gọi hàm không thể xuất hiện ở bên tay trái của biểu thức gán? Trong ví dụ trên, kể từ a === fn(), sự khác nhau giữa a = 5fn() = 5 là gì. Tôi biết rằng ES5 spec yêu cầu này, nhưng tại sao nó được thiết kế như thế?

+0

'fn() ' là một biểu thức và không phải là một tham chiếu biến, và bạn không thể gán bất cứ điều gì cho điều đó. –

+0

Nhưng thứ tự đánh giá từ trái sang phải, nếu 'fn()' được đánh giá đầu tiên, nó sẽ trả về 'a', vì' fn() === a'. Và 'a' là một biến và có thể lưu trữ các giá trị. –

+5

nó trả về giá trị của a, không phải là tham chiếu đến biến số –

Trả lời

2

Theo specification of assignments, các từ ngữ sau đây không hợp lệ là mục tiêu cho một bài tập:

this 
Literal 
ArrayLiteral 
ObjectLiteral 
FunctionExpression 
ClassExpression 
GeneratorExpression 
RegularExpressionLiteral 
TemplateLiteral 

Ví dụ, bài tập sau không hợp lệ quá:

this = "bar"; // this 
"foo" = "bar"; // Literal 
/foo/ = "bar"; // RegularExpressionLiteral 
["foo"] = "bar"; // ArrayLiteral 
0

Thực tế là f() có thể đánh giá một tài liệu tham khảo, trong trường hợp bạn gán một đối tượng để a trước khi gọi hàm, không làm thay đổi thực tế rằng f() là một biểu hiện (giống như ví dụ 1+a). Và gán chỉ có thể được áp dụng cho một biến. MDN

+0

Xin chào @Kirill, cảm ơn câu trả lời. 'Và gán chỉ có thể được áp dụng cho một biến.' Tôi không nghĩ rằng điều này là chính xác. Bạn chắc chắn có thể áp dụng nhiệm vụ cho thuộc tính đối tượng và phần tử mảng, ngoài biến. –

+0

@ leslie.zhang thực tế nói, các thuộc tính đối tượng và các phần tử mảng có thể được xem là tham chiếu biến và do đó có thể được sử dụng để gán. –

0

Tương tự như vậy, theo quan điểm thế giới ngôn ngữ JavaScript của "this(thiết ...) bất khả xâm phạm."

Mục đích , và do đó giá trị hiện tại, của biến số this, nhất thiết phải được bảo vệ khỏi các sửa đổi tùy ý theo chương trình.

Tương tự, "bạn chỉ cần không thể nói rằng 'một hàm', bất kể nó là gì, 'bằng' 5 '." (Khá rõ ràng, một trong số này là một "hàm", và cái kia là "hằng số nguyên", và như vậy, "không bao giờ cặp song sinh sẽ gặp nhau.")

Trình thông dịch JavaScript, giống như mọi thông dịch viên ngôn ngữ khác trên hành tinh này, được thiết kế và xây dựng bằng cách sử dụng cùng một chiến lược thực hiện ngôn ngữ (và các công cụ ...) được sử dụng bởi mọi ngôn ngữ khác đã từng được phát minh.

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