Jadual Kandungan
回复内容:
Rumah pembangunan bahagian belakang tutorial php javascript - 面试题:为什么要用闭包?

javascript - 面试题:为什么要用闭包?

Dec 01, 2016 am 12:26 AM
java javascript php

看了这个回答似乎也不是了解的很透彻啊

我是学Java的。今天在面试的时候面试官提及匿名类,我说Java8里面提供了Lamada式,在JS里也有闭包这个概念。面试官问什么是闭包?为什么要用闭包?

  • 我说:用来控制访问啊。内部可以访问外部,但是外部不能访问内部。

面试官似乎不是很满意这样的回答。不知各位大神对这个问题有什么看法?

回复内容:

看了这个回答似乎也不是了解的很透彻啊

我是学Java的。今天在面试的时候面试官提及匿名类,我说Java8里面提供了Lamada式,在JS里也有闭包这个概念。面试官问什么是闭包?为什么要用闭包?

  • 我说:用来控制访问啊。内部可以访问外部,但是外部不能访问内部。

面试官似乎不是很满意这样的回答。不知各位大神对这个问题有什么看法?

闭包,顾名思义,就是把馒头变成包子~

馒头全是面粉,包上馅就成了包子

包子是带馅的馒头

闭包是自带运行环境的函数

发哥是自带背景音乐的男人~


有童鞋不理解“自带运行环境”的含义~

再举例说一次吧~

码农们都吃过方便面吧~
它和普通面条有什么区别呢?
就是 自带调味包 。
调味包就是方便面的烹饪环境。
它简化了煮面条的流程。让用户不必练就厨艺也能吃上美味的内牛满面。

函数式编程的闭包,就是函数的调味包。
方便用户调用函数。不必为了维护繁杂的外部状态而烦恼。
例如python,就把闭包玩出了很多花样:
静态私有变量啦~
偏函数啦~
单参化~
装饰器~
……

当你在用这些功能的时候,其实就是在吃别人设定好调味包的“方便面”。

其实我的理解:闭包的目的是用来扩大变量的作用域的。

立即执行函数和闭包有什么关系

重点看下@边城的理解,我的答案比较单薄,要是还感兴趣,可以看下高程三对作用域链、闭包这段的阐述~

刚看的一篇文章 史上被骂最多的编程语言——JavaScript

楼主的回答并不准确,如果我是面试官我也不满意。
简单来说,闭包是指当函数被当成对象返回时,如果夹带了外部变量就形成了闭包。我非常赞同那位比喻把馒头加上馅变成包子的同学的回答,他虽是调侃成分居多,但理解的程度非常之深刻。

如果一个函数打包了外部变量,就可以给程序非常大的灵活性,你可以把闭包理解成轻量级的接口封装,虽然对外都是这个函数(调用方式不变),但是因为之中的变量不一样,就可以完成很多功能。这也就是那位同学说的自带运行环境的函数,自带背景音乐的男人,想想都可怕。

如果你想还深入了解一点,可以参考我总结的一篇文章,详解Python中的闭包,虽然编程语言不一样,但是道理是一样的。

你的回答是关于作用域的回答,不是关于闭包的。而且这个回答也是属于不严谨的回答。你根本解释不清什么是内部,什么是外部。

我认为闭包是这样的。当一个函数在定义它的作用域以外的地方被调用时,它访问的依然是定义它时的作用域。这种现象称之为闭包。

具体用途有好多,常见的有创建私有属性,函数柯里化等等。

------------分割线------------

我再补充一下,其实闭包的本质是静态作用域。因为 JavaScript 没有动态作用域,所以函数访问的都是定义时的作用域,所以闭包才得以实现。

其他答案里说闭包是自带运行环境的函数。但是实际上,JavaScript 里任何函数不都是自带运行环境的函数吗?有的人也因此认为所有的函数都是闭包。这当然也不算错,但对理解闭包其实意义不大。因为你平时都是这么使用函数的,即使你不知道什么是闭包,也不会出什么问题。只不过平时你可能没有意识到全局作用域就是一个大闭包。

我们常见的闭包形式就是a 函数套 b 函数,然后 a 函数返回 b 函数,这样 b 函数在 a 函数以外的地方执行时,依然能访问 a 函数的作用域。其中“b 函数在 a 函数以外的地方执行时”这一点,才体现了闭包的真正的强大之处。

总之,闭包只是基于静态作用域的一个编程技巧。从面试的角度来说,你要回答什么是闭包,你首先得解释什么静态作用域的特点,然后还必须要强调“b 函数在 a 函数以外的地方执行时”这一点,才算是对闭包的完整回答。

lambda演算式只允许单输入单输出,所以lambda a, b: a + b就等于lambda a: lambda b: a + b也就是currying。

简单来说,闭包的定义是:函数能访问它被定义时的作用域。

所以,你说的访问控制之类的,只是闭包的一个应用场景而已,当然没有回答什么是闭包的问题,面试官自然就不满意。

另外,Java里面其实是不支持闭包的,匿名内部类看起来跟闭包差不多,但实际上不管是功能性还是实现层面都不能算是闭包。因为:

  1. 从功能上,匿名内部类里面访问的变量必须是final(Java8隐含声明final)

  2. 实现上,匿名内部类里访问的final变量值其实是从外面被拷贝进去了,所以其并不能真正访问到之前的作用域,这也是为什么必须是final的原因。

所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。
在Javascript中创建一个闭包来解释闭包最好不过:

<code>function a(){
var i=0;
function b(){
alert(++i);
}
return b;
}
var c=a();
c();</code>
Salin selepas log masuk

函数b嵌套在函数a内部;函数a返回函数b。
这样在执行完var c=a( )后,变量c实际上是指向了函数b,再执行c( )后就会弹出一个窗口显示i的值(第一次为1)。这段代码其实就创建了一个闭包,因为函数a外的变量c引用了函数a内的函数b,也就是说:当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。

其实按照闭包的一般写法形式,简单的来说就是 函数里面又嵌套了函数。在团队开发中,为了防止命名冲突,我们一般会把相应的代码用闭包的形式包裹起来,以避免暴露在全局作用域下面。但是有个不好的地方是其内部变量不会被立马回收,有内存溢出的风险。

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Akan R.E.P.O. Ada Crossplay?
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana anda menghuraikan dan memproses HTML/XML dalam PHP? Bagaimana anda menghuraikan dan memproses HTML/XML dalam PHP? Feb 07, 2025 am 11:57 AM

Tutorial ini menunjukkan cara memproses dokumen XML dengan cekap menggunakan PHP. XML (bahasa markup extensible) adalah bahasa markup berasaskan teks yang serba boleh yang direka untuk pembacaan manusia dan parsing mesin. Ia biasanya digunakan untuk penyimpanan data

Jelaskan JSON Web Tokens (JWT) dan kes penggunaannya dalam PHP API. Jelaskan JSON Web Tokens (JWT) dan kes penggunaannya dalam PHP API. Apr 05, 2025 am 12:04 AM

JWT adalah standard terbuka berdasarkan JSON, yang digunakan untuk menghantar maklumat secara selamat antara pihak, terutamanya untuk pengesahan identiti dan pertukaran maklumat. 1. JWT terdiri daripada tiga bahagian: header, muatan dan tandatangan. 2. Prinsip kerja JWT termasuk tiga langkah: menjana JWT, mengesahkan JWT dan muatan parsing. 3. Apabila menggunakan JWT untuk pengesahan di PHP, JWT boleh dijana dan disahkan, dan peranan pengguna dan maklumat kebenaran boleh dimasukkan dalam penggunaan lanjutan. 4. Kesilapan umum termasuk kegagalan pengesahan tandatangan, tamat tempoh, dan muatan besar. Kemahiran penyahpepijatan termasuk menggunakan alat debugging dan pembalakan. 5. Pengoptimuman prestasi dan amalan terbaik termasuk menggunakan algoritma tandatangan yang sesuai, menetapkan tempoh kesahihan dengan munasabah,

Program PHP untuk mengira vokal dalam rentetan Program PHP untuk mengira vokal dalam rentetan Feb 07, 2025 pm 12:12 PM

Rentetan adalah urutan aksara, termasuk huruf, nombor, dan simbol. Tutorial ini akan mempelajari cara mengira bilangan vokal dalam rentetan yang diberikan dalam PHP menggunakan kaedah yang berbeza. Vokal dalam bahasa Inggeris adalah a, e, i, o, u, dan mereka boleh menjadi huruf besar atau huruf kecil. Apa itu vokal? Vokal adalah watak abjad yang mewakili sebutan tertentu. Terdapat lima vokal dalam bahasa Inggeris, termasuk huruf besar dan huruf kecil: a, e, i, o, u Contoh 1 Input: String = "TutorialSpoint" Output: 6 menjelaskan Vokal dalam rentetan "TutorialSpoint" adalah u, o, i, a, o, i. Terdapat 6 yuan sebanyak 6

Cuti atau kembali dari Java 8 Stream Foreach? Cuti atau kembali dari Java 8 Stream Foreach? Feb 07, 2025 pm 12:09 PM

Java 8 memperkenalkan API Stream, menyediakan cara yang kuat dan ekspresif untuk memproses koleksi data. Walau bagaimanapun, soalan biasa apabila menggunakan aliran adalah: bagaimana untuk memecahkan atau kembali dari operasi foreach? Gelung tradisional membolehkan gangguan awal atau pulangan, tetapi kaedah Foreach Stream tidak menyokong secara langsung kaedah ini. Artikel ini akan menerangkan sebab -sebab dan meneroka kaedah alternatif untuk melaksanakan penamatan pramatang dalam sistem pemprosesan aliran. Bacaan Lanjut: Penambahbaikan API Java Stream Memahami aliran aliran Kaedah Foreach adalah operasi terminal yang melakukan satu operasi pada setiap elemen dalam aliran. Niat reka bentuknya adalah

Terangkan pengikatan statik lewat dalam php (statik: :). Terangkan pengikatan statik lewat dalam php (statik: :). Apr 03, 2025 am 12:04 AM

Mengikat statik (statik: :) Melaksanakan pengikatan statik lewat (LSB) dalam PHP, yang membolehkan kelas panggilan dirujuk dalam konteks statik dan bukannya menentukan kelas. 1) Proses parsing dilakukan pada masa runtime, 2) Cari kelas panggilan dalam hubungan warisan, 3) ia boleh membawa overhead prestasi.

Apakah kaedah Magic PHP (__construct, __destruct, __call, __get, __set, dll) dan menyediakan kes penggunaan? Apakah kaedah Magic PHP (__construct, __destruct, __call, __get, __set, dll) dan menyediakan kes penggunaan? Apr 03, 2025 am 12:03 AM

Apakah kaedah sihir PHP? Kaedah sihir PHP termasuk: 1. \ _ \ _ Membina, digunakan untuk memulakan objek; 2. \ _ \ _ Destruct, digunakan untuk membersihkan sumber; 3. \ _ \ _ Call, mengendalikan panggilan kaedah yang tidak wujud; 4. \ _ \ _ Mendapatkan, melaksanakan akses atribut dinamik; 5. \ _ \ _ Set, melaksanakan tetapan atribut dinamik. Kaedah ini secara automatik dipanggil dalam situasi tertentu, meningkatkan fleksibiliti dan kecekapan kod.

Terangkan ungkapan perlawanan (Php 8) dan bagaimana ia berbeza dari suis. Terangkan ungkapan perlawanan (Php 8) dan bagaimana ia berbeza dari suis. Apr 06, 2025 am 12:03 AM

Dalam Php8, ungkapan perlawanan adalah struktur kawalan baru yang mengembalikan hasil yang berbeza berdasarkan nilai ungkapan. 1) Ia sama dengan pernyataan suis, tetapi mengembalikan nilai dan bukannya blok pernyataan pelaksanaan. 2) Ekspresi perlawanan secara ketat (===), yang meningkatkan keselamatan. 3) Ia mengelakkan kemungkinan ketinggalan dalam penyataan suis dan meningkatkan kesederhanaan dan kebolehbacaan kod.

Program Java untuk mencari kelantangan kapsul Program Java untuk mencari kelantangan kapsul Feb 07, 2025 am 11:37 AM

Kapsul adalah angka geometri tiga dimensi, terdiri daripada silinder dan hemisfera di kedua-dua hujungnya. Jumlah kapsul boleh dikira dengan menambahkan isipadu silinder dan jumlah hemisfera di kedua -dua hujungnya. Tutorial ini akan membincangkan cara mengira jumlah kapsul yang diberikan dalam Java menggunakan kaedah yang berbeza. Formula volum kapsul Formula untuk jumlah kapsul adalah seperti berikut: Kelantangan kapsul = isipadu isipadu silinder Dua jumlah hemisfera dalam, R: Radius hemisfera. H: Ketinggian silinder (tidak termasuk hemisfera). Contoh 1 masukkan Jejari = 5 unit Ketinggian = 10 unit Output Jilid = 1570.8 Unit padu menjelaskan Kirakan kelantangan menggunakan formula: Kelantangan = π × r2 × h (4

See all articles