2012-05-07 39 views
5

Bu komut dosyası, düğüm js kabuğundan çalışıp çalışmadığına veya düğüme iletilen bir komut dosyasında saklandığına göre farklı davranışlara sahiptir.Genelde işlevler neden kullanılamaz?

Senaryo:

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

kabuğunda Çıktı (sadece son 4 satır IMO alakalı 3 çizgilerin her biri idi Mac OS X Terminal içinde çalışan bir düğüm REPL örneğine kopyalama/yapıştırılan sırayla.):

ArrayBuffer 
Int8Array 
Uint8Array 
Int16Array 
Uint16Array 
Int32Array 
Uint32Array 
Float32Array 
Float64Array 
DataView 
global 
process 
GLOBAL 
root 
Buffer 
setTimeout 
setInterval 
clearTimeout 
clearInterval 
console 
: (Mac OS X üzerinde bash node myscript.js adlandırılır) kaydedilmiş bir komut dosyası olarak çalıştırmak
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 

Çıktı

Neden farklılar ve neden benim komutum ve bglobal numaralı makalede görünmüyor?

DÜZENLEME: Ek bir deyim ekleyerek c = 2 çıktıyı değiştirdi. c betiği çalıştırmanın her iki yönteminde de görülebilir. Bu yine de betiği kabuktan çalıştırırken a ve b'nin varlığını açıklamıyor.

+1

Denemenize katkıda bulunabilir misiniz: 1) Var değişkensiz bir değişken ataması: Yani sadece bir "c = 3"; 2) 'console.log (this === global)' –

+0

Ayrıca, bu dosyaları Node'a nasıl aktardığınızı da ayrıntılandırabilir misiniz? (Tam komut satırları) –

+0

Bitti. Başka bir şey var mı? – Trindaz

cevap

4

Temel olarak, Node'un REPL'si "genel" içeriği "bu" olduğu için kullanmasıdır (bunu global === this ile test edebilirsiniz). Bununla birlikte, normal modüller kendi ayrı kapanmalarında çalışırlar. Yani böyle şey olmayı hayal edebilirsiniz:

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

Yani Gözlerinde farklı bir var tanımlayıp bir komut dosyası olarak çalıştırmak, gerçekten sadece bir işlev kapağın iç tanımlamadan ediyoruz. Ancak REPL'de, var olanı global düzeyde tanımlıyorsunuz.

+0

Teşekkürler @TooTallNate. '(Ile global olarak var kıl) için' '(buradaki var k için)' yi değiştirirken, hiçbir şey basmaz. Komutumun oluşturduğu sembollerle nasıl yineleyebileceğime dair ipuçları var mı? – Trindaz

+0

Bir modülde, "bu", modülün "dışa aktarma" yerine küresel bağlamı işaret eder. Bununla birlikte, kapatma değişkenlerini yinelemenin hiçbir yolu olmadığını düşünüyorum. Bu sadece bir JavaScript kısıtlaması. – TooTallNate

+0

@TooTallNate Tüm değişken adı kombinasyonları üzerinde yinelemek için kaba kuvvet kullanabilirsiniz: P –

İlgili konular