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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JavaScript中函数的变量提升问题

發布時間:2024/1/17 javascript 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaScript中函数的变量提升问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

函數的大體分三種,一種是函數的聲明,一種是函數表達式(又稱為函數的字面量)

  1.函數的聲明 => function myFn(){};

  2.函數的表達式 => var myFn = function() {};

  3.函數對象方式 => var myFn = new Function('n1','n2','return n1 + n2 '); ?// tip:?參數必須加引號

以上:3和其他的兩項用法差別較大,不作比較;主要介紹1與2的區別:

  先看二個簡單的例子:

var myFn = function () {console.log('mm'); };myFn(); //mmvar myFn = function () {console.log('nn'); };myFn(); //nn

在看下這個:

function myFn() {console.log('mm'); }; myFn(); //nnfunction myFn() {console.log('nn'); }; myFn(); //nn

  為什么會出現以上兩種情況呢? 我們知道JavaScript的代碼是一行一行執行的,但是在代碼執行之前,瀏覽器會有一個預解析的過程,會把聲明的變量,函數的表達式提升,然后再一行一行的執行代碼;但是為什么兩個打印的結果不一樣呢? 因為第一個是變量的提升,函數本身并沒有提升,而第二個函數表達式會整個提升,所以myFn()寫在哪,結果都是一樣的;

  我們這個時候可能回想,如果他們在一起的時候,哪個先執行?

  第一種情況:

var myFn = function () {console.log('nn'); } myFn(); // nnfunction myFn() {console.log('mm'); } myFn(); // nn

  第二種情況:

function myFn() {console.log('mm'); } myFn(); // mmvar myFn = function () {console.log('nn'); } myFn(); // nn

  這里注意的一點是,變量的提升高于函數表達式;在第一種情況下,var ?=?myFn 會提升最高的優先級,其次是函數的聲明。

  在第一種情況里,函數的聲明會提升,然后會被函數表達式覆蓋,所以會打印兩次一樣的;第二次該提升的會提升,代碼會一步一的執行; ?

看一下,下面的一段的代碼執行情況,檢驗一下:

myFn(); function myFn() {console.log('mm'); } myFn(); var myFn = function () {console.log('nn'); }

這里可以很明顯的看到結果 =>打印兩次 ?// mm

?

下面我們在介紹一種,在函數內部的變量提升(先看一段代碼)

function myFn(a) {var a = 2;console.log(b);console.log(a);var b = 0 ; } myFn(1); // undefined 2

在函數的內部,如果函數有參數的話,就相當于在函數內部聲明了這個變量,如上面例子:先聲明 var a;調用的時候傳來參數,則 a =1 ,若果在函數內部把a在賦值,那么a就等于新賦值的值;而b是不是參數,但在函數內部定義了,由于變量的提升,會打印underfind,這是變量定義,但是沒有賦值,只有在函數賦值后,才能打印該值;

  

?

轉載于:https://www.cnblogs.com/wxb-it/p/6931248.html

總結

以上是生活随笔為你收集整理的JavaScript中函数的变量提升问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。