2012-05-07 25 views
5

Tập lệnh này có hành vi khác nhau dựa trên việc nó có chạy từ vỏ nút js hay được lưu trữ trong tệp tập lệnh được chuyển đến nút hay không.Tại sao các chức năng không có sẵn trong đối tượng toàn cầu?

Script:

var a = 1; 
function b(){return 1;} 
for(var k in global) console.log(k); 

Output trong vỏ (chỉ có 4 dòng cuối cùng có liên quan IMO Mỗi phòng trong số 3 dòng là sao chép/dán liên tục vào một trường hợp nút REPL chạy trong Terminal trên Mac OS X.):

ArrayBuffer 
Int8Array 
Uint8Array 
Int16Array 
Uint16Array 
Int32Array 
Uint32Array 
Float32Array 
Float64Array 
DataView 
global 
process 
GLOBAL 
root 
Buffer 
setTimeout 
setInterval 
clearTimeout 
clearInterval 
console 
module 
require 
a 
_ 
b 
k 

Output khi chạy như một kịch bản lưu (gọi tắt là node myscript.js từ bash trên Mac OS X):

ArrayBuffer 
Int8Array 
Uint8Array 
Int16Array 
Uint16Array 
Int32Array 
Uint32Array 
Float32Array 
Float64Array 
DataView 
global 
process 
GLOBAL 
root 
Buffer 
setTimeout 
setInterval 
clearTimeout 
clearInterval 
console 

Tại sao chúng khác nhau và tại sao tập lệnh của tôi không thể xem ab trong global?

CHỈNH SỬA: Thêm câu lệnh bổ sung c = 2 đã thay đổi đầu ra. c được hiển thị trong cả hai phương thức chạy tập lệnh. Điều này vẫn không giải thích sự hiện diện của a và b khi chạy kịch bản từ trình bao.

+1

Bạn có thể thêm vào thử nghiệm của mình không: 1) Phân bổ biến không có 'var': Vì vậy, chỉ cần thực hiện' c = 3'; 2) 'console.log (this === global)' –

+0

Bạn cũng có thể nêu chi tiết cách bạn chuyển các tệp này sang Node không? (Các dòng lệnh chính xác) –

+0

Xong. Còn gì nữa không? – Trindaz

Trả lời

4

Về cơ bản đó là vì REPL của Node sử dụng ngữ cảnh "toàn cầu" vì nó là "này" (bạn có thể kiểm tra điều đó với global === this).

Tuy nhiên, các mô-đun thông thường chạy trong phần đóng riêng của chúng. Vì vậy, bạn có thể tưởng tượng nó là một cái gì đó như thế này:

function (module, exports, global) { 
    // your module code 
} 

Vì vậy, khi bạn định nghĩa một var tại của bạn và thực hiện nó như một kịch bản, bạn đang thực sự chỉ cần xác định nó bên trong một đóng chức năng. Nhưng trong REPL, bạn đang định nghĩa var ở mức toàn cầu.

+0

Cảm ơn @TooTallNate. Khi thay thế '(cho var k trong global)' với '(cho var k trong này)' nó sẽ không in ra gì cả. Bất kỳ gợi ý nào về cách tôi có thể lặp qua các ký hiệu được tạo bởi tập lệnh của tôi? – Trindaz

+0

Bên trong một mô-đun, 'this' trỏ đến' xuất khẩu' của mô-đun, không phải là ngữ cảnh chung. Tuy nhiên, tôi tin rằng không có cách nào để lặp lại các biến đóng. Nó chỉ là một hạn chế của JavaScript. – TooTallNate

+0

@TooTallNate Bạn có thể sử dụng sức mạnh vũ phu để lặp qua tất cả các kết hợp tên biến: P –

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