亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

JavaScript的變量聲明提升

標簽:
JavaScript

说变量声明提升之前,先抛出一个疑问:JavaScript是解释型语言,还是编译型语言?
对于这个问题,几乎所有初学者都坚定不移的给了我答案:“JavaScript是解释型语言”,但是随着你对JavaScript的了解,会产生疑问,解释性语言怎么还会有变量提升。因此,说JavaScript是一个解释性语言其实并不准确,因为JavaScript代码刚好在执行前一瞬间,会被编译(具体解释需要很长篇幅,下次再说)


由于误以为JavaScript是纯粹的解释型语言,会对下面这段代码产生误解

a = 1;var a;console.log(a);

按照我们正常的思路,会想var a时候我们将a这个变量重新定义了,因此,最后打印的a会是undefined,然而事实上真正的结果是1

对于语句 var a = 1 ,其实应该被分成两个部分

  • var a 声明变量:在编译阶段被处理的事情

  • a = 1 变量赋值:在执行阶段发生的事情

所以,就在执行的前一瞬间,刚好发生了变量声明提升,因此刚刚那段代码变成了这个样子

var a; 
a = 1;console.log(a); // 毫无疑问,a = 1

似乎弄懂了变量声明提升?那就看一下这个问题

console.log(a);var a = 1;

结果是undefined,但一定有人坚定的认为结果应该是1,还有人认为会报错,认为报错的同学,回去上一条看看变量声明提升,认为结果是1的同学,我再多解释一下 我一直在说的,是变量声明提升,并没有说赋值会提升,因此这个代码在执行前的一瞬间是这样子的

var a; 
console.log(a);
a = 1;

JavaScript里对于定义但没有赋值的变量,毫无疑问,就是undefined


变量声明提升,是不能突破作用域的,我们还是来看一个例子

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

!!!!!!!!!!!!报错了
很显然,函数test形成了一个函数作用域,函数内部声明变量a会提升到函数test作用域的最前面,但不会突破函数作用域,跑到全局作用域里面取去。

删掉全局作用域被错误使用的  a

function test () { 
    console.log(a);    var a = 1;
}
test();  // 如我们所料,结果是undefined



作者:小蝉_蝉
链接:https://www.jianshu.com/p/33c626d9fb2d


點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消