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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

js作用域和提升

發(fā)布時(shí)間:2023/12/31 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 js作用域和提升 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一.聲明

1.變量聲明

var

聲明了未賦值為undefined

可以重復(fù)聲明

可以重復(fù)賦值

let

聲明了未賦值為undefined

不可以重復(fù)聲明

可以重復(fù)賦值

const

聲明了就得賦值

不可以重復(fù)聲明

不可以重復(fù)賦值

2.函數(shù)聲明

聲明式:function fun(){};

函數(shù)表達(dá)式:var/let/const fun = function(){};相當(dāng)于一個(gè)變量

3.同名的情況

let、const參與的聲明不存在同名問題。

(1)變量和變量同名:var和var;var和函數(shù)表達(dá)式;函數(shù)表達(dá)式和函數(shù)表達(dá)式。

(2)函數(shù)與函數(shù)同名:聲明式函數(shù)和聲明式函數(shù)。

(3)變量和函數(shù)同名:var和聲明式函數(shù);聲明式函數(shù)和函數(shù)表達(dá)式。

二. 作用域

作用域:變量和函數(shù)可以訪問的范圍。

全局作用域:無論是函數(shù)外還是函數(shù)內(nèi)都能訪問到。

局部作用域:只能在函數(shù)內(nèi)訪問,在函數(shù)外不能訪問。

  • 變量的作用域
  • (1)全局變量:

    在函數(shù)外使用var聲明的變量;

    無論是函數(shù)內(nèi)外都沒有使用var聲明就直接賦值的變量。a=1

    (2)局部變量:在函數(shù)內(nèi)使用var聲明的變量。

  • 函數(shù)的作用域
  • (1)全局函數(shù):在函數(shù)外聲明的函數(shù)。

    (3)局部函數(shù):在函數(shù)內(nèi)聲明的函數(shù)。

    3. 作用域鏈:就是作用域之間的相互嵌套,在查找變量的時(shí)候,會(huì)先到當(dāng)前作用域下查找,如果在當(dāng)前作用域沒有變量聲明,就會(huì)一直往上一級(jí)作用域查找。

    三.提升

    提升:在真正執(zhí)行js代碼之前,還有一個(gè)操作叫做預(yù)解析,預(yù)解析操作會(huì)找到文件中所有的聲明,并且使用合適的作用域?qū)⑺鼈冴P(guān)聯(lián)起來,變量和函數(shù)的聲明會(huì)被提升到與其對(duì)應(yīng)作用域的最頂端。

    變量創(chuàng)建的過程:

    var a = 1;

    (1)聲明及初始化賦值階段(聲明階段):var a = undefined;

    (2)真實(shí)賦值階段(賦值賦值):a = 1。

    1. 變量的提升

    (1)使用var聲明的變量只能提升聲明階段,賦值階段還停留在原地。

    (2)隱式聲明的變量不會(huì)提升。a=1;

    2. 函數(shù)的提升

    (1)使用聲明式函數(shù)創(chuàng)建的函數(shù),聲明及賦值階段全都會(huì)被提升。

    (2)使用函數(shù)表達(dá)式創(chuàng)建的函數(shù)只提升聲明階段,賦值階段還停留在原地。

    (3)當(dāng)函數(shù)被聲明在判斷語句內(nèi)部時(shí),JS會(huì)將函數(shù)聲明當(dāng)成表達(dá)式(賦值聲明),即不會(huì)提升

    3. 變量和函數(shù)的同名提升情況

    (1)變量和變量同名:var和var;var和函數(shù)表達(dá)式;函數(shù)表達(dá)式和函數(shù)表達(dá)式。會(huì)按順序提升,結(jié)果取決于最后面的值。

    (2)函數(shù)與函數(shù)同名:聲明式函數(shù)和聲明式函數(shù)。會(huì)按順序提升,結(jié)果取決于最后面的值。

    var a = 1;

    var a = function(){};

    console.log(a)

    var a;

    var a;

    a = 1;

    a = function(){};

    console.log(a);

    (3)變量和函數(shù)同名:var和聲明式函數(shù);聲明式函數(shù)和函數(shù)表達(dá)式。會(huì)按順序提升,結(jié)果取決于變量是否有值,變量有值就取變量值,變量沒值就取函數(shù)值。

    var a=1;

    function a(){};

    console.log(a);

    var a;

    function a(){};

    a=1;

    console.log(a)

    全局作用域

    局部作用域

    提升

    隱式聲明的變量a=1;

    函數(shù)內(nèi)、外

    var

    函數(shù)外

    函數(shù)內(nèi)

    提升聲明部分

    let

    {}

    const

    {}

    函數(shù)

    函數(shù)外

    函數(shù)內(nèi)

    聲明式函數(shù)是整體提升;函數(shù)表達(dá)式提升聲明部分

    作用域貫穿整個(gè)步驟

    第一步:找聲明(是否符合聲明規(guī)則,聲明種類:var/聲明式函數(shù)/函數(shù)表達(dá)式)

    第二步:找提升(對(duì)應(yīng)的提升規(guī)則,同名問題)

    var a = 1;

    function b(){

    ????a = 10;

    ????return;

    ????function a(){

    ????????console.log(a);

    ????}

    }

    b();

    console.log(a);

    fn(30);

    var fn = 10;

    function fn(fn){

    ?????console.log(fn);

    ?????var fn = 20;

    ?????console.log(fn);

    ?????function fn(){

    ????? console.log(fn);

    ?????}

    }

    console.log(fn);

    function fn(fn) {

    // var fn=30;

    function fn() {

    console.log(fn);

    }

    var fn;

    console.log(fn);//1function

    fn = 20;

    console.log(fn);//2 20

    }

    var fn;

    fn(30);

    fn = 10;

    console.log(fn);//10

    總結(jié)

    以上是生活随笔為你收集整理的js作用域和提升的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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