Jadual Kandungan
1、为什么会是这样?
2、每个作用域是都会提升
Rumah hujung hadapan web tutorial js 关于javaScript中作用域和闭包的知识讲解

关于javaScript中作用域和闭包的知识讲解

Aug 09, 2018 am 11:36 AM

复习小结:函数作用域和块的作用域的行为是一样的,可以认为,任何声明在某个作用域的变量,都将附属于这个作用域

1、为什么会是这样?

1、现在我们出两个问题,给出下面两段代码,请先思考输出的结果,再去实践一下,相信你会出现疑惑!

//第一段代码
a=2;
var a;
console.log(a);

//第二段代码
console.log(a);
var a=2;
Salin selepas log masuk

2、我猜结果是这样的:第一段代码你猜结果是underfined,然后浏览器上运行结果却是2;第二段代码你猜结果是2,但是浏览器上运行的结果是underfined。兄弟!是不是这样(即便不是这样我猜你肯定也是其他形式的错误猜测)。

3、我们在解释一下为什么第一段代码结果是2,而第二段代码的结果是undefined,首先回想之前我们说的一个var a=2的代码在JS看来就是两段代码:var a和a=2;前者是在编译时候进行的后者是在运行时执行的,那么问题来了?变量和函数的声明都会都在程序执行前被处理,那么代码的运行顺序还是你看到的书写顺序么?

4、对于第一段代码,第二行代码 var a在编译的时候率先被处理,第一、三行在运行时被处理,那么整个代码的处里形式如下:

//第一段代码被JS这样的顺序处理了
var a;
a=2;
console.log(a);
Salin selepas log masuk

你看!按照这样的处理方式你就能看懂了,哦!先声明在赋值,最后打印出来。

5、同样的道理,第二段代码的处理方式是这样的:

//第二段代码被JS以这样的形式处理:
var a;
console.log(a);
a=2;
Salin selepas log masuk

在编译的时候a已经被声明了,但是在执行的时候,执行到console.log(a)之前a就没有被赋值,打印出来当然是underfined;

6、所以代码被JS处理的过程中,变量和函数的声明在代码中的位置好像被移动到了作用域最上面,这个在编译过程中声明的优先处理的过程就是提升

2、每个作用域是都会提升

1、来看下面这个代码:

foo();

function foo(){
    console.log(a);
    var a=2;
}
Salin selepas log masuk

全局作用域会对foo函数声明进行提升,在foo作用域中又会对a进行提升,处理的形式如下:

function foo(){
    var a;
    console.log(a);
    a=2;
}
foo();
Salin selepas log masuk

2、特别注意:函数声明会被提升,但是函数表达式不会被提升具名的函数表达式,名称标识符在赋值之前也没有办法在所在作用域中使用,这两句话什么意思?下面两段代码告诉你:

foo();  TypeError
bar();  ReferenceError
var foo=function bar(){
    //....
}
Salin selepas log masuk

这段代码被提升后是这样的:

var foo;
foo();  TypeError
bar();  ReferenceError
foo=function (){
    var bar...
    //....
}
Salin selepas log masuk

所以对于foo,有声明,但是对foo没有赋值,foo就是undefined,这时对undefined进行操作当然是操作类型的错误。而bar,连声明都没有,声明在foo的函数表达式中,所以就是未声明的错误。

3、对于提升来说:函数优先提升,其次是变量

相关推荐:

深入理解javascript作用域和闭包

详解JavaScript作用域和闭包

Atas ialah kandungan terperinci 关于javaScript中作用域和闭包的知识讲解. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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.

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)

Apa yang perlu saya lakukan jika saya menghadapi percetakan kod yang dihiasi untuk resit kertas terma depan? Apa yang perlu saya lakukan jika saya menghadapi percetakan kod yang dihiasi untuk resit kertas terma depan? Apr 04, 2025 pm 02:42 PM

Soalan dan penyelesaian yang sering ditanya untuk percetakan tiket kertas terma depan dalam pembangunan front-end, percetakan tiket adalah keperluan umum. Walau bagaimanapun, banyak pemaju sedang melaksanakan ...

Siapa yang dibayar lebih banyak Python atau JavaScript? Siapa yang dibayar lebih banyak Python atau JavaScript? Apr 04, 2025 am 12:09 AM

Tidak ada gaji mutlak untuk pemaju Python dan JavaScript, bergantung kepada kemahiran dan keperluan industri. 1. Python boleh dibayar lebih banyak dalam sains data dan pembelajaran mesin. 2. JavaScript mempunyai permintaan yang besar dalam perkembangan depan dan stack penuh, dan gajinya juga cukup besar. 3. Faktor mempengaruhi termasuk pengalaman, lokasi geografi, saiz syarikat dan kemahiran khusus.

Bagaimana untuk menggabungkan elemen array dengan ID yang sama ke dalam satu objek menggunakan JavaScript? Bagaimana untuk menggabungkan elemen array dengan ID yang sama ke dalam satu objek menggunakan JavaScript? Apr 04, 2025 pm 05:09 PM

Bagaimana cara menggabungkan elemen array dengan ID yang sama ke dalam satu objek dalam JavaScript? Semasa memproses data, kita sering menghadapi keperluan untuk mempunyai id yang sama ...

Demystifying JavaScript: Apa yang berlaku dan mengapa penting Demystifying JavaScript: Apa yang berlaku dan mengapa penting Apr 09, 2025 am 12:07 AM

JavaScript adalah asas kepada pembangunan web moden, dan fungsi utamanya termasuk pengaturcaraan yang didorong oleh peristiwa, penjanaan kandungan dinamik dan pengaturcaraan tak segerak. 1) Pengaturcaraan yang didorong oleh peristiwa membolehkan laman web berubah secara dinamik mengikut operasi pengguna. 2) Penjanaan kandungan dinamik membolehkan kandungan halaman diselaraskan mengikut syarat. 3) Pengaturcaraan Asynchronous memastikan bahawa antara muka pengguna tidak disekat. JavaScript digunakan secara meluas dalam interaksi web, aplikasi satu halaman dan pembangunan sisi pelayan, sangat meningkatkan fleksibiliti pengalaman pengguna dan pembangunan silang platform.

Perbezaan dalam Konsol.Log Output Result: Mengapa kedua -dua panggilan berbeza? Perbezaan dalam Konsol.Log Output Result: Mengapa kedua -dua panggilan berbeza? Apr 04, 2025 pm 05:12 PM

Perbincangan mendalam mengenai punca-punca utama perbezaan dalam output konsol.log. Artikel ini akan menganalisis perbezaan hasil output fungsi Console.log dalam sekeping kod dan menerangkan sebab -sebab di belakangnya. � ...

TypeScript untuk pemula, Bahagian 2: Jenis Data Asas TypeScript untuk pemula, Bahagian 2: Jenis Data Asas Mar 19, 2025 am 09:10 AM

Sebaik sahaja anda telah menguasai tutorial TypeScript peringkat kemasukan, anda harus dapat menulis kod anda sendiri dalam IDE yang menyokong TypeScript dan menyusunnya ke dalam JavaScript. Tutorial ini akan menyelam ke dalam pelbagai jenis data dalam TypeScript. JavaScript mempunyai tujuh jenis data: null, undefined, boolean, nombor, rentetan, simbol (diperkenalkan oleh ES6) dan objek. Typescript mentakrifkan lebih banyak jenis atas dasar ini, dan tutorial ini akan meliputi semuanya secara terperinci. Jenis data null Seperti JavaScript, Null dalam TypeScript

Bagaimana untuk mencapai kesan menatal paralaks dan kesan animasi elemen, seperti laman web rasmi Shiseido?
atau:
Bagaimanakah kita dapat mencapai kesan animasi yang disertai dengan menatal halaman seperti laman web rasmi Shiseido? Bagaimana untuk mencapai kesan menatal paralaks dan kesan animasi elemen, seperti laman web rasmi Shiseido? atau: Bagaimanakah kita dapat mencapai kesan animasi yang disertai dengan menatal halaman seperti laman web rasmi Shiseido? Apr 04, 2025 pm 05:36 PM

Perbincangan mengenai realisasi kesan animasi tatal dan elemen Parallax dalam artikel ini akan meneroka bagaimana untuk mencapai yang serupa dengan laman web rasmi Shiseido (https://www.shiseido.co.jp/sb/wonderland/) ... ...

Bolehkah PowerPoint menjalankan JavaScript? Bolehkah PowerPoint menjalankan JavaScript? Apr 01, 2025 pm 05:17 PM

JavaScript boleh dijalankan di PowerPoint, dan boleh dilaksanakan dengan memanggil fail JavaScript luaran atau membenamkan fail HTML melalui VBA. 1. Untuk menggunakan VBA untuk memanggil fail JavaScript, anda perlu mendayakan makro dan mempunyai pengetahuan pengaturcaraan VBA. 2. Benamkan fail HTML yang mengandungi JavaScript, yang mudah dan mudah digunakan tetapi tertakluk kepada sekatan keselamatan. Kelebihan termasuk fungsi lanjutan dan fleksibiliti, sementara kelemahan melibatkan keselamatan, keserasian dan kerumitan. Dalam praktiknya, perhatian harus dibayar kepada keselamatan, keserasian, prestasi dan pengalaman pengguna.

See all articles