2012-03-13 12 views
36
var test = { 
    demo: function(){ 
     //get the caller context here 
    } 
} 
//when this gets called, the caller context should be window. 
test.demo(); 

tôi đã cố gắng arguments.calleearguments.callee.caller, và không may mắn ...Có thể nhận ngữ cảnh người gọi trong javascript không?

+0

Bạn có ý nghĩa gì với "ngữ cảnh người gọi"? Có lẽ bạn có nghĩa là giá trị của từ khóa * this * của nó? – RobG

+0

@ RobG, trong ví dụ của tôi, nó phải là 'cửa sổ', có hiệu lực 'this' từ khóa tại trang web gọi điện. –

+0

test.demo.call (cửa sổ); – cycaHuH

Trả lời

36

Kể từ this referes từ khóa để ThisBinding trong một LexicalEnvironment, và javascript (hoặc ECMAScript) không cho phép truy cập chương trình đối với LexicalEnvironment (trong thực tế, không có truy cập có lập trình cho toàn bộ Execution Context), do đó, nó là không thể để nhận bối cảnh của người gọi.

Ngoài ra, khi bạn cố gắng test.demo() trong bối cảnh toàn cầu, cần có không gọi ở tất cả, không phải gắn một bối cảnh đến gọi, đây chỉ là một luật toàn cầu , không phải là một bối cảnh gọi điện thoại .

+0

+1 Làm cho cảm giác hoàn hảo – Sarfraz

+1

@ otakustay — Bạn hoàn toàn chính xác về việc không thể tham chiếu các biến như thuộc tính của các đối tượng biến khác. Nhưng như một trường hợp đặc biệt, các biến toàn cầu được tạo ra các đặc tính của đối tượng toàn cầu, do đó bạn có thể truy cập các biến thực tế trong ngữ cảnh gọi ** nếu ** nó là toàn cầu. Bạn có thể thử nghiệm cho thuộc tính 'arguments.callee.caller' (không được chấp nhận), và nếu nó là' null' giả định cuộc gọi là từ mã toàn cục, thì hy vọng bạn không ở chế độ nghiêm ngặt ES5, hãy tham chiếu đến đối tượng toàn cầu và đi từ đó. – RobG

+0

Đây là nơi bạn gặp sự cố với Node.JS và các mô-đun. – Qix

4

Giá trị của từ khóa this của hàm được đặt bởi lệnh gọi, không phải là "ngữ cảnh". Các hàm có ngữ cảnh thực thi, bao gồm giá trị này. Nó không được xác định bởi this.

Trong mọi trường hợp, vì tất cả các hàm có biến số this là thuộc tính của đối tượng biến, bạn không thể tham chiếu bất kỳ từ khóa nào khác trừ khi nó được chuyển đến hàm. Bạn không thể truy cập trực tiếp vào đối tượng biến; bạn phụ thuộc vào độ phân giải biến trên chuỗi phạm vi để this sẽ luôn là ngữ cảnh thực thi hiện tại this.

8

Theo ngữ cảnh, tôi giả sử bạn có nghĩa là this? Điều đó phụ thuộc vào cách hàm được gọi ra, không phải từ hàm được gọi.

Ví dụ (sử dụng một giao diện điều khiển Webkit):

var test = { 
    demo: function() { 
     console.log(this); 
    } 
} 
test.demo(); // logs the "test" object 
var test2 = test.demo; 
test2();  // logs "DOMWindow" 
test.demo.apply("Cheese"); // logs "String" 

Ngẫu nhiên, arguments.caller bị phản đối.