Saya mendapat potongan kode untuk javascript yang tidak saya mengerti:
function dmy(d) {
function pad2(n) {
return (n < 10) ? '0' + n : n;
}
return pad2(d.getUTCDate()) + '/' +
pad2(d.getUTCMonth() + 1) + '/' +
d.getUTCFullYear();
}
function outerFunc(base) {
var punc = "!";
//inner function
function returnString(ext) {
return base + ext + punc;
}
return returnString;
}
Bagaimana suatu fungsi dapat didefinisikan dalam fungsi lain? Bisakah kita memanggil pad2 () dari luar fungsi saya ()?
Tolong beri penerangan padanya. Terima kasih
javascript
nested-function
Thomas
sumber
sumber
Jawaban:
Fungsi adalah jenis variabel lain dalam JavaScript (tentu saja dengan beberapa nuansa). Membuat fungsi di dalam fungsi lain mengubah ruang lingkup fungsi dengan cara yang sama akan mengubah ruang lingkup variabel. Ini sangat penting untuk digunakan dengan closure guna mengurangi polusi namespace global total.
Fungsi yang ditentukan dalam fungsi lain tidak akan dapat diakses di luar fungsi kecuali jika telah dilampirkan ke objek yang dapat diakses di luar fungsi:
Dalam contoh ini, fungsi baz akan tersedia untuk digunakan setelah
foo
fungsi dijalankan, karena digantiwindow.baz
. Fungsi bilah tidak akan tersedia untuk konteks apa pun selain cakupan yang ada di dalamfoo
fungsi.sebagai contoh yang berbeda:
The
Fizz
Fungsi dirancang sebagai konstruktor sehingga, ketika dijalankan, akan menetapkan sebuahbuzz
fungsi untuk objek yang baru dibuat.sumber
Ini disebut penutupan .
Pada dasarnya, fungsi yang ditentukan dalam fungsi lain hanya dapat diakses di dalam fungsi ini. Tetapi dapat dilewati sebagai hasil dan kemudian hasil ini dapat dipanggil.
Ini adalah fitur yang sangat kuat. Anda dapat melihat penjelasan lebih lanjut di sini:
javascript_closures_for_dummies.html mirror di Archive.org
sumber
setara (atau sangat mirip) dengan
kecuali saya salah.
Jadi tidak ada hal lucu yang terjadi.
sumber
Instansiasi fungsi diperbolehkan di dalam dan di luar fungsi. Di dalam fungsi tersebut, seperti halnya variabel, fungsi yang disarangkan bersifat lokal dan oleh karena itu tidak dapat diperoleh dari lingkup luar.
foo
memanipulasibar
dalam dirinya sendiri.bar
tidak dapat disentuh dari lingkup luar kecuali ditentukan di lingkup luar.Jadi ini tidak akan berhasil:
sumber
Saat Anda mendeklarasikan suatu fungsi dalam suatu fungsi, fungsi dalam hanya tersedia dalam cakupan di mana fungsi tersebut dideklarasikan, atau dalam kasus Anda,
pad2
hanya dapat dipanggil didmy
cakupan tersebut.Semua variabel yang ada
dmy
terlihat dipad2
, tetapi tidak terjadi sebaliknya: Dsumber
Sangat normal dalam Javascript (dan banyak bahasa) untuk memiliki fungsi di dalam fungsi.
Luangkan waktu untuk mempelajari bahasanya, jangan menggunakannya atas dasar bahwa itu mirip dengan yang sudah Anda ketahui. Saya sarankan menonton seri presentasi YUI Douglas Crockford tentang Javascript, dengan fokus khusus pada Act III: Function the Ultimate (tautan ke unduhan video, slide, dan transkrip)
sumber
Akan menimbulkan kesalahan. Karena
bar
didefinisikan di dalamfoo
,bar
hanya akan dapat diakses di dalamfoo
.Untuk menggunakan
bar
Anda perlu menjalankannya di dalamfoo
.sumber