国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

js函數(shù)聲明提升與變量提升

Rindia / 3223人閱讀

摘要:在編譯階段,函數(shù)聲明和變量聲明都會(huì)被先處理置于執(zhí)行環(huán)境的頂部,且賦值會(huì)被留在原地,這個(gè)過程稱之為提升。另外函數(shù)聲明提升不會(huì)被變量聲明覆蓋,但會(huì)被變量賦值覆蓋。

看到相關(guān)的前端面試題,總結(jié)一下知識(shí)點(diǎn),大神請(qǐng)飄過。
JS在編譯階段,函數(shù)聲明和變量聲明都會(huì)被先處理置于執(zhí)行環(huán)境的頂部,且賦值會(huì)被留在原地,這個(gè)過程稱之為提升。
舉個(gè)簡(jiǎn)單例子:

console.log(i);
var i = 1;
function fn () {
  console.log(2)
}

實(shí)際上代碼順序是這樣的:

 function fn () {
  console.log(2)
}
var i;
console.log(i);
i = 1;
一、變量提升

變量聲明在編譯階段被處理,而變量賦值則留在原地等待執(zhí)行。

console.log(i);   // undefined
var i = 1;
console.log(i);   // 1

相當(dāng)于:

var i;
console.log(i);   // 由于i只聲明未賦值,輸出undefined
i = 1;
console.log(i)    // i已賦值,輸出1

一道測(cè)試題

  var age = 10;
  function person () {
      age = 100;
      console.log(age);  // 100
      var age;
      console.log(age)  // 100
  }
  person();
  console.log(age);   // 10
二、函數(shù)提升

解析器在解析時(shí)對(duì)函數(shù)聲明與函數(shù)表達(dá)式有著不同的優(yōu)先級(jí),實(shí)際上編譯階段函數(shù)聲明會(huì)先于變量被提升,并使其在執(zhí)行任何代碼之前可訪問,函數(shù)表達(dá)式實(shí)際上是變量聲明的一種,因此函數(shù)聲明提升優(yōu)于函數(shù)表達(dá)式

console.log(fn(1));    // 1
function fn (a) {
    return a;
}

如上面的代碼,由于函數(shù)聲明被置于執(zhí)行環(huán)境頂部,即使調(diào)用函數(shù)的代碼在聲明函數(shù)之前也可以正確訪問。再看函數(shù)表達(dá)式的例子:

console.log(fn(1));
var fn = function (a) {
    return a;
}

// 相當(dāng)于

var fn;
console.log(fn(1));
fn = function (a) {
  return a;
}
// fn is not a function

上面的例子之所以報(bào)錯(cuò),是因?yàn)樽兞縡n聲明后還未對(duì)函數(shù)引用。
另外函數(shù)聲明提升不會(huì)被變量聲明覆蓋,但會(huì)被變量賦值覆蓋。
變量未賦值的例子:

  function fn(){
    console.log(1);
  }
  var fn;
  console.log(fn);    // 由于后一個(gè)fn只聲明未負(fù)值,因此輸出的是函數(shù)fn
  

變量賦值的例子:

  function fn(){
    console.log(1);
  }
  var fn = function () {
      console.log(2)
  };
  fn();    // 2
  
  // 相當(dāng)于
  
  function fn(){
    console.log(1);
  }
  var fn;
  fn = function () {
      console.log(2)
  };
  fn();    // 2(因?yàn)槁暶鞯暮瘮?shù)fn被后一個(gè)已引用函數(shù)的變量fn所覆蓋,因此輸出2)
  

再來點(diǎn):

  fn();
  var fn = function () {
    console.log(1);
  }
  fn();
  function fn () {
    console.log(2);
  }
  var fn;
  fn();
  // 依次輸出2,1,1
  

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/93196.html

相關(guān)文章

  • js變量提升函數(shù)提升的機(jī)制

    摘要:所謂變量提升,提升就是為了事先聲明變量。變量提升之后,但其賦值還是留在原本的位置等運(yùn)行到了之后動(dòng)態(tài)賦值,而函數(shù)提升之后直接相當(dāng)于在代碼里抽空了。搞明白這個(gè)例子也就搞懂了作用域中變量和函數(shù)是怎么提升的。 問題 showImg(https://segmentfault.com/img/bVJ614?w=222&h=165); 在這個(gè)例子中它應(yīng)該輸出什么?輸出的結(jié)果是6。 showImg(h...

    fasss 評(píng)論0 收藏0
  • ES6 變量作用域提升變量的生命周期詳解

    摘要:不同的是函數(shù)體并不會(huì)再被提升至函數(shù)作用域頭部,而僅會(huì)被提升到塊級(jí)作用域頭部避免全局變量在計(jì)算機(jī)編程中,全局變量指的是在所有作用域中都能訪問的變量。 ES6 變量作用域與提升:變量的生命周期詳解從屬于筆者的現(xiàn)代 JavaScript 開發(fā):語法基礎(chǔ)與實(shí)踐技巧系列文章。本文詳細(xì)討論了 JavaScript 中作用域、執(zhí)行上下文、不同作用域下變量提升與函數(shù)提升的表現(xiàn)、頂層對(duì)象以及如何避免創(chuàng)建...

    lmxdawn 評(píng)論0 收藏0
  • 5分鐘深入了解js變量提升

    摘要:對(duì)于大多數(shù)開發(fā)者來說,變量提升可以說是一個(gè)非常常見的問題,但是可能很多人對(duì)其不是特別的了解。如果說擁有和一樣的變量提升效果的話,那么應(yīng)該是輸出。而和它們的變量提升的效果是一樣的,也都存在著臨死性死區(qū)的概念。 對(duì)于大多數(shù)js開發(fā)者來說,變量提升可以說是一個(gè)非常常見的問題,但是可能很多人對(duì)其不是特別的了解。所以在此,我想來講一講。 先從一個(gè)簡(jiǎn)單的例子來入門: a = 2; var a; ...

    tinysun1234 評(píng)論0 收藏0
  • JS變量生命周期:為什么 let 沒有被提升

    摘要:請(qǐng)注意,就變量生命周期而言,聲明階段與變量聲明是不同的概念。提升在生命周期中無效的原因如上所述,提升是變量在作用域頂部的耦合聲明和初始化階段。然而,生命周期分離聲明和初始化階段。解耦消除了的提升期限。 為了保證的可讀性,本文采用意譯而非直譯。 提升是將變量或函數(shù)定義移動(dòng)到作用域頭部的過程,通常是 var 聲明的變量和函數(shù)聲明function fun() {...}。 當(dāng) ES6 引入l...

    hoohack 評(píng)論0 收藏0
  • JS變量生命周期:為什么 let 沒有被提升

    摘要:請(qǐng)注意,就變量生命周期而言,聲明階段與變量聲明是不同的概念。提升在生命周期中無效的原因如上所述,提升是變量在作用域頂部的耦合聲明和初始化階段。然而,生命周期分離聲明和初始化階段。解耦消除了的提升期限。 為了保證的可讀性,本文采用意譯而非直譯。 提升是將變量或函數(shù)定義移動(dòng)到作用域頭部的過程,通常是 var 聲明的變量和函數(shù)聲明function fun() {...}。 當(dāng) ES6 引入l...

    Steven 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<