本篇章我們簡述的是 es6初級知識點,認識es6,以及es6變數和es5的變數和函數。 ECMAScript 6簡介 ECMAScript 6.0(以下簡稱ES6)是JavaScript語言的下一代標準,已經在2015年6月正式發佈了。它的目標,是使得JavaScript語言可以用來編寫複雜的大型應 ...
本篇章我們簡述的是 es6初級知識點,認識es6,以及es6變數和es5的變數和函數。
ECMAScript 6簡介
ECMAScript 6.0(以下簡稱ES6)是JavaScript語言的下一代標準,已經在2015年6月正式發佈了。它的目標,是使得JavaScript語言可以用來編寫複雜的大型應用程式,成為企業級開發語言。
ECMAScript和JavaScript的關係
一個常見的問題是,ECMAScript和JavaScript到底是什麼關係?
一個常見的問題是,ECMAScript和JavaScript到底是什麼關係?
要講清楚這個問題,需要回顧歷史。1996年11月,JavaScript的創造者Netscape公司,決定將JavaScript提交給國際標準化組織ECMA,希望這種語言能夠成為國際標準。次年,ECMA發佈262號標準文件(ECMA-262)的第一版,規定了瀏覽器腳本語言的標準,並將這種語言稱為ECMAScript,這個版本就是1.0版。
該標準從一開始就是針對JavaScript語言制定的,但是之所以不叫JavaScript,有兩個原因。一是商標,Java是Sun公司的商標,根據授權協議,只有Netscape公司可以合法地使用JavaScript這個名字,且JavaScript本身也已經被Netscape公司註冊為商標。二是想體現這門語言的制定者是ECMA,不是Netscape,這樣有利於保證這門語言的開放性和中立性。
因此,ECMAScript和JavaScript的關係是,前者是後者的規格,後者是前者的一種實現(另外的ECMAScript方言還有Jscript和ActionScript)。日常場合,這兩個詞是可以互換的。
以上是對Es6和javaScript的瞭解,現在我們正式開始學習Es6
1.我們先瞭解es5的一些知識
1.變數
Es5聲明變數的方式有哪些?
一共有三種:
第一是:var
第二是:function
第三是:我們需要註意 不能忽略函數的形參(形參也是變數它是函數的私有變數)
var 定義變數
var 有個功能是變數提升但是不能定義 給window 添加一個對應的屬性。
聲明和定義是兩碼事
定義是 = 號賦值
function 既可以提前聲明,同時還定義了
什麼是定義?
所謂定義就是給變數賦值了
作用域問題:
var 的作用域
怎麼理解 域 這個詞?
域是範圍的意思
什麼是全局作用域?:
在window下聲明的變數或者在函數外聲明的變數
什麼是局部作用域?:
在函數內聲明的變數
想學習作用域,必須瞭解瀏覽器執行的機制:
瀏覽器在執行時候會開闢一個大空間(window) ,window下麵分兩個模塊,棧記憶體(執行模塊,棧記憶體也叫作用域),堆記憶體(也叫存儲模塊)。棧記憶體用來存放變數的記憶體地址,堆記憶體主要存放代碼塊的,然後瀏覽器從上到下執行代碼。
function 聲明的變數
function 聲明的變數也會給window添加一個屬性 屬性值是方法
下麵我們說一下函數的歸屬問題:
1.函數歸屬誰跟它在哪調用無關,跟在那定義有關
//函數歸誰,跟它在哪調用無關,跟它在哪定義有關。
var a=10;
function fn(){
var a=12
return function(){
console.log(a)
}
}
//ff()是fn中的匿名函數
var ff=fn()
ff()//12
2.任何一個函數都有返回值,如果寫了 return return返回什麼就是什麼,如果沒有寫return 得到的是undefined
//任何一個函數執行後都有一個返回值,如果寫了return return的是什麼就得到什麼,
//如果沒有return得到的是undefined
//如果是我把return a 給刪掉 那麼console.log(a)列印的是undefined
function fn(){
var a=20;
return a
}
console.log(fn())
對於變數來說 它的作用域只有 window和函數(函數執行時會開闢一個私有作用域)
3.函數在if中的特殊情況:
在if語句中定義的函數(很特殊),只聲明不定義,當條件成立的時候,if模塊中不管函數在哪聲明的函數,都會第一步對這個函數定義,再去執行if裡面的代碼
//函數在if中的特殊情況
var a=12;
console.log(fn)//undefined
if(a){
console.log(fn)//列印出fn()
function fn(){
console.log("hrllo 1807b")
}
}
條件不成立:if裡面的代碼就不會執行,所以就不會列印函數fn()
//條件不成立
var a=12;
console.log(fn)//undefined
if(a==false){
console.log(fn)//
function fn(){
console.log("hrllo 1807b")
}
}
console.log(fn)//undefined
以上是小編對Es5變數已經函數作用域的基礎知識,現在我們開始學習Es6
1.變數
Es6提供了四種定義變數?
第一種:let
第二種:cont
第三種:class
第四種:import
let:
let它是Es6提供的一種聲明變數的方式
1.沒有變數提升這個功能 在聲明之前不能使用
2.不能重覆的聲明
3.不會給window添加屬性
let塊級作用域:
帶 {} 的都是塊級作用域,if(){} for(){} 對象{} 函數不是塊級 作用域,因為函數本身就是個私有作用域
var 和function 沒有塊級作用域的這個概念,let和const有塊級這個作用域
作用域是對於變數的
1.在塊級作用域下 var和function 跟在window下一樣,function很特殊,在塊級作用域前,只會提前聲明不會定義
console.log(a)//undefined
console.log(get)//undefined
{
console.log(get)//function(){}
var a=5
function get(){
console.log(111)
}
}
console.log(a)//5
console.log(get)//function(){}
2.在塊級作用域下 let和conts聲明的變數是私有的,外面訪問不到
{
let a=100
}
console.log(a)//Uncaught ReferenceError: a is not defined
3.在for迴圈下let 聲明變數不會泄露
var list=document.querySelector("#list").querySelectorAll("li") for(var i=0;i<list.length;i++){//length=3 list[i].onclick=function(){ alert(i)//3 } }
事件是非同步的,for迴圈結束後i是3並且i還是全局的,點擊了 li 最後彈出i,i此時是3,所以都會彈出3
var list=document.querySelector("#list").querySelectorAll("li") for(let i=0;i<list.length;i++){//length=3 list[i].onclick=function(){ alert(i)//3 } }
4.塊級作用域和對象的區別?
這個是塊級作用域:
// 塊級作用域
{
name:"zhangsan",
age:12
}
{} 如果想表示對象,不能放行首,就是前面不能沒東西,如果{} 前面沒有東西 就是塊級作用域
console.log({
name:"zhangsan",
age:12
})
裡面必須加一個() 因為如果不加就是個塊級作用域,我們要把eval轉成對象,對象前面不能沒東西。
eval 是將字元串轉js代碼
eval('({name:"zhangsan",age:22})') console.log(eval('({name:"zhangsan",age:22})'))
什麼是暫時性死區?:
如果塊級作用域內使用 let和const聲明變數了,這個區域就會被這個變數強制綁定,凡是在聲明這些變數都是不可用的,使用會報錯,這就是暫時性死區
// 什麼是暫時性死區?
var a=10;
{
//會報錯 Uncaught ReferenceError: Cannot access 'a' before initialization
console.log(a);
let a=20;
console.log(a)
}
console.log(a)
什麼是暫時性死區的場景?:
// 暫時性死區的場景
function fn(a=b,b=2){
console.log(a,b)
}
fn()
使用變數b在定義b之前了,就出現了暫時性死區,a=b和b=2換下位置
1.寫法上 有預設值的寫後面,沒有預設值的寫前面
2.如果傳對於的參數,就不要預設值了(就沒有覆蓋了),不是先賦預設值,然後再去實參去覆蓋,如果沒有參數在去
let a=a 報錯,賦值運算從右往左,右邊使用變數a結果發現a沒有聲明,而let語法規定不能在沒定義之前使用變數,所以報錯。
var a=a 不報錯 因為var 有變數提升這個功能,在等會賦值時,從右往左,使用變數a此時a是undefined,賦值時候又把undefined覆給了a,所以a還是undefined