2017-01-09 47 views
17

İki değişkene blok kapsamı ile bildirmek ve bunları aynı değere sıfırlamak istiyorum. ... şu şekilde çalıştı eğer iyi olurdu ama öyle değilBlok kapsamıyla çoklu atama ve başlatma yapmak için bir yol var mı?

'a' bildirilmiş sanki fonksiyon kapsamı vardır, değil kapsamını ama değişken 'b' blok vardır
{ 
    let a = b = "wang"; 
} 
console.log("b:", b); 

Değişken bir var.

Ben karakter bir çift kurtarmak için, otobüsün altında okunabilirliği atmak olacağını değil * ...

let a, b; 
a = b = "wang"; 

Bunu gerçekleştirmenin tek bir satır halinde * yolu var mı yoksa yapmam gerekiyor sen anladım, sadece merak ediyorum! aşağıdaki gibi

+0

O 'var' gibi değil bir yardımcı işlev olarak bu uygulamaya iyi bir fikir olabilir. Bu kapalı bir küresel olur. Bunu yapma! – Oriol

+0

@ ordis, "var" gibi bir şeydir, bu yüzden örtük bir küresel haline gelir. Bunu James Thorpe gibi yapın – edc65

+0

@ edc65 Hayır, 'var' gibi değil. 'var' beyanları katı modda atmaz. Örtülü globals yapar. – Oriol

cevap

23

Tek let bildiriminde yapabilirsiniz:

{ 
    let a = "wang", b = a; 
} 
console.log("b:", b); //undefined or ReferenceError 

a hem Çünkü ve b parantez içindeki let ile ilan edilecek ve her iki bloğu kapsam olsun. Önce a'u atamanız gerekir, böylece b'a atamadan önce atandınız.

+0

Bunun en iyi ve en uygun yol olduğunu hissediyorum – murli2308

+0

Teşekkürler. Muhtemelen en iyi okunabilirlik için kısa ifadelerle bunu kullanmak en iyisidir. – technicalbloke

2

Ödevin sağdan sola doğru olur

{ let [a, b] = [3, 3]; console.log(a); console.log(b)} 
2

deneyebilir miyiz. Yani, deyim uygulanabilir için a ve b
Diğer tüm değişkenler var/let deyimi olmadan Küresel olarak kabul edilir değil let dolayısıyla b olacak Sen fill ile dizi destructuring kullanabilirsiniz

11

küresel değer tekrarlamaktan kaçınmak için :

{ 
 
    let [a, b, c, d] = Array(4).fill("wang"); 
 
    console.log(a, b, c, d); // "wang", "wang", "wang", "wang" 
 
} 
 
a; // ReferenceError

Eğer değişkenlerin sayısı hakkında rahatsız etmek istemiyorum ve bi tahsis etmek istemiyorsanız G dizileri, ayrıca hemen çağrılan bir jeneratör işlevi ifadesini de kullanabilirsiniz. Kolaylık olması açısından,

const repeat = function*(value){while(true) yield value}; 
 
{ 
 
    let [a, b, c, d] = repeat("wang"); 
 
    console.log(a, b, c, d); // "wang", "wang", "wang", "wang" 
 
} 
 
a; // ReferenceError

+0

Teşekkürler, bu akıllıca bir yaklaşım. Sonuç olarak muhtemelen öfkeyle kullanmıyorum ama bilmek her zaman güzel;) – technicalbloke

+1

'işlev tekrarı (x) {while (true) verim x; } 'bir yardımcı fonksiyona ayrılmalıdır. Bir parametrenin kullanılması, 'let [a, b, c] = yinelemede ({…}) 'tüm değişkenlerin her yinelemede oluşturulan kopyalar yerine referans değerini paylaşması avantajına sahiptir. – Bergi

+0

@Bergi Evet, değer bir nesne ya da sembol olsaydı sorun olacağını düşündüm. Bir yardımcı fonksiyon kullanmak iyi bir fikirdir, teşekkürler. – Oriol