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