日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JS函数简单的底层原理 -变量重复声明无效,隐式申明,变量提升,函数提升,以及堆栈内存的变化

發(fā)布時間:2023/12/31 javascript 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JS函数简单的底层原理 -变量重复声明无效,隐式申明,变量提升,函数提升,以及堆栈内存的变化 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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();// p

2.在同一個作用域下,只要是發(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();// 6666

3.在函數(shù)中, 如果有 不用 任何聲明符號聲明的變量直接使用(如: a = 10 ),并且在該函數(shù)中沒有聲明該變量, 且全局函數(shù)中也沒有聲明該變量, a =10, 會被隱式聲明 為var a = 10,改變量會被提升為全局變量.

function b() { a = 10;return;};var a = 1;b();console.log(a); // 10
  • 5.在預(yù)解析階段,會給var申明的變量,和函數(shù)聲明方式聲明的函數(shù),分配內(nèi)存空間(堆內(nèi)存或者是棧內(nèi)容空間).這里注意this的指向問題.

    在JS中有一種預(yù)解析機制,就是在解析時會將函數(shù)申明和變量申明提前解析。
    在預(yù)解析階段會進行變量和函數(shù)提升,提升到該作用域的最頂部。在這里很明顯進行了函數(shù)提升,和變量提升,且函數(shù)優(yōu)先提升到本作用域的最頂部,其次是進行變量提升。

    function b() { a();var a = 10;console.log(a); // 10return;function a() {console.log(a); // 這里打印函數(shù)體 ,};};b();

    變量和函數(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。