javascript
JS函数简单的底层原理 -变量重复声明无效,隐式申明,变量提升,函数提升,以及堆栈内存的变化
JS函數(shù)簡單的底層原理
(個(gè)人理解):
1. 已經(jīng)使用var申明且賦值,若再次申明,則第二次申明(不賦值)無效。
2.在同一個(gè)作用域下,只要是發(fā)生了同名,且變量完成賦值,后者會(huì)覆蓋前者。存在兩個(gè)相同的函數(shù)名的函數(shù),后一個(gè)函數(shù)會(huì)覆蓋前一個(gè)函數(shù)。用var聲明的變量(需要賦值)亦是如此。
3.js代碼執(zhí)行機(jī)制從上至下, 作用域查找機(jī)制 從里到外,就近原則。
4.在預(yù)解析階段,會(huì)給var申明的變量進(jìn)行變量提升,和函數(shù)申明方式申明的函數(shù)進(jìn)行函數(shù)提升(其他方式申明或創(chuàng)建的函數(shù)不具有函數(shù)提升),分配內(nèi)存空間(堆內(nèi)存或者是棧內(nèi)容空間).這里注意this的指向問題.
5.在函數(shù)中, 如果有 不用 任何聲明符號(hào)聲明的變量直接使用(如: a = 10 ),并且在該函數(shù)中沒有聲明該變量, 且全局函數(shù)中也沒有聲明該變量, a =10, 會(huì)被隱式聲明 為var a = 10,改變量會(huì)被提升為全局變量.
1. 已經(jīng)使用var申明且賦值,若再次申明,則第二次申明(不賦值)無效。
就是說在同一作用域下,重復(fù)申明的變量(同名),但不賦值的變量,后一次的聲明的變量無效,不會(huì)對(duì)原有的變量和函數(shù)產(chǎn)生影響。
var a = 1 ;var a;cosnoel.log(a) //1function a(){console.log('p'); }; var a; a();// p2.在同一個(gè)作用域下,只要是發(fā)生了同名,且變量完成賦值,后者會(huì)覆蓋前者。存在兩個(gè)相同的函數(shù)名的函數(shù),后一個(gè)函數(shù)會(huì)覆蓋前一個(gè)函數(shù)。用var聲明的變量(需要賦值)亦是如此。
var a = 1; var a = 2;console.log(a);//2function a(){ // console.log(22)};var a = 10;a();// a is not a function //這里進(jìn)行了變量提升和函數(shù)提升,函數(shù)提升優(yōu)先級(jí)高于變量提升,然后變量a又進(jìn)行了賦值,且函數(shù)名和變量名相同就覆蓋了函數(shù)a了//相同函數(shù)名,后一個(gè)函數(shù)覆蓋前一個(gè)函數(shù)。 function a(){console.log(99); }; function a(){console.log(6666) }; a();// 66663.在函數(shù)中, 如果有 不用 任何聲明符號(hào)聲明的變量直接使用(如: a = 10 ),并且在該函數(shù)中沒有聲明該變量, 且全局函數(shù)中也沒有聲明該變量, a =10, 會(huì)被隱式聲明 為var a = 10,改變量會(huì)被提升為全局變量.
function b() { a = 10;return;};var a = 1;b();console.log(a); // 105.在預(yù)解析階段,會(huì)給var申明的變量,和函數(shù)聲明方式聲明的函數(shù),分配內(nèi)存空間(堆內(nèi)存或者是棧內(nèi)容空間).這里注意this的指向問題.
在JS中有一種預(yù)解析機(jī)制,就是在解析時(shí)會(huì)將函數(shù)申明和變量申明提前解析。
在預(yù)解析階段會(huì)進(jìn)行變量和函數(shù)提升,提升到該作用域的最頂部。在這里很明顯進(jìn)行了函數(shù)提升,和變量提升,且函數(shù)優(yōu)先提升到本作用域的最頂部,其次是進(jìn)行變量提升。
變量和函數(shù)提升后
function b() { function a() {console.log(a); // 這里打印函數(shù)體 function(){console.log(a)}};var a ;a();a = 10;console.log(a); // 10return;};b(); 在預(yù)解析時(shí),同步在內(nèi)存堆棧內(nèi)存中開辟內(nèi)存空間,進(jìn)行存儲(chǔ),看下面的詳細(xì)分解總結(jié)
以上是生活随笔為你收集整理的JS函数简单的底层原理 -变量重复声明无效,隐式申明,变量提升,函数提升,以及堆栈内存的变化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mvp和fmvp有什么区别
- 下一篇: JS快速实现深拷贝--一行就搞定了