es6簡單介紹

let和const

原先聲明變量的形式

var test = 5;  //全局變量
function a()
{var cc=3; //局部變量alert(test);
}
function b(){alert(test);}test = 5;//全局變量 
function a()
{aa=3; //全局變量alert(test);
}

在es6之前,作用域只有全局作用域和函數作用域,沒有塊級作用域,所以考慮如下代碼

{ var a = 6;var a = 8}
console.log(a)  // 答案是8

我們本來想著用{}表示一塊作用域,外面應該訪問不到里面的變量,但是事實是var聲明的變量泄漏到全局作用域了。所以引出let
let有三個個特點:

  • 不能重復賦值
  • 作用域是局部作用域
  • 不存在變量提升
{let a=10;let a=11}
Uncaught SyntaxError: Identifier 'a' has already been declared
{let a = 10}
a
Uncaught ReferenceError: a is not definedat <anonymous>:1:1

作用域是塊級作用域

var a = [];
for (var i = 0; i < 10; i++) {a[i] = function () {console.log(i);};
}
a[0]();  // 10

因為var定義的是全局,所以在內存中只維護一塊空間,每次+1的時候這塊空間的值發生改變,而數組中的每個函數的引用都指向這一塊空間,當最后調用的時候那塊空間的值就是10了,所以結果就是10了

var a = [];
for (let i = 0; i < 10; i++) {a[i] = function () {console.log(i);};
}
a[0]();   // 0

let聲明的是塊級作用域,所以每一次循環的i其實都是一個新的變量,每次循環都會創建新的內存空間,每個放到數組中的函數都指向對應的內存空間的值,等調用的時候就調用指向的值。那么問題來了,如果每一輪循環的變量i都是重新聲明的,那它怎么知道上一輪循環的值,從而計算出本輪循環的值?這是因為 JavaScript 引擎內部會記住上一輪循環的值,初始化本輪的變量i時,就在上一輪循環的基礎上進行計算

變量提升

console.log(foo); // undefined
var foo = 2;

在es6之前,變量使用在定義之前得到的結果是undefiend,這種現象叫做變量提升,這其實不符合正常的編程邏輯。
js引擎在解釋的時候從上到下,先找定義的變量,也就是說下面代碼其實是這樣的

var foo;
console.log(foo); // undefined
foo = 2;

有了let之后

console.log(foo); // 報錯
let foo = 2;   

塊級作用域

內層變量可能會覆蓋外層變量

var tmp = 5;function f() {console.log(tmp);if (false) {var tmp = 'hello world';}
}f(); // undefined

至于結果為啥是undefined參考變量提升的解釋。在內部定義的var tmp = 'hello world';的在解釋的時候在函數作用域內是先var tmp

用來計數的循環變量泄露為全局變量

for (var i = 0; i < 5; i++) {console.log(s[i]);
}console.log(i); // 5

變量i只用來控制循環,但是循環結束后,它并沒有消失,泄露成了全局變量。

const

const定義的變量有兩點需要注意:

  • 不能只用來聲明,聲明的時候就必須賦值
  • 不能修改

const的作用域與let命令相同:只在聲明所在的塊級作用域內有效。

模板字符串

在es6之前,我們拼接字符串都有+,這種方式是繁瑣的,可以使用反引號(`)標識。
反引號主要有3個作用:

  1. 當作普通字符串
  2. 定義多行字符串(相當于python的三引號)
  3. 在字符串中嵌入變量
d
10
`iloce${d}`
"iloce10"

箭頭函數

箭頭函數就是函數的一種縮寫形式

//無形參
var f = () => 5;
// 等同于
var f = function () { return 5 };//多個形參
var sum = (num1, num2) => num1 + num2;
// 等同于
var sum = function(num1, num2) {return num1 + num2;
};

箭頭函數有一點需要注意
在es6之前,函數體內的this對象,就是使用時所在的對象,而不是定義時所在的對象

 var person = {name:'jack',age:18,  fav:function(){        console.log(this)}}person.fav();

用了箭頭函數之后,函數體內的this對象,就是定義時所在的對象,而不是使用時所在的對象

 var person2 = {name:'jack',age:18,fav: ()=>{// 當前this指向了定義時person2對象時所處的對象(window)console.log(this);}}person2.fav();

為了解決這個問題, 使用對象的單體模式:

 var person2 = {name:'jack',age:18,fav() {// 當前this指向了定義時person2對象時所處的對象(window)console.log(this);}}person2.fav();

面向對象

在es6之前創建對象是這樣做的

function Animal(name,age){this.name = name;this.age = age;}Animal.prototype.showName = function(){console.log(this.name);console.log(this.age);}var a = new Animal('小黃',5);a.showName();

我們在python中通過class就能定義一個對象,在es6中也可以這樣做

class People {// 類似python中的initconstructor(name,age){this.age = age;this.name = name;}eat(){console.log('111')}study() {console.log('1222')}
}

定義“類”的方法的時候,前面不需要加上function這個關鍵字,直接把函數定義放進去了就可以了。另外,方法之間不需要逗號分隔,加了會報錯。

轉載于:https://www.cnblogs.com/longyunfeigu/p/9328357.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/389102.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/389102.shtml
英文地址,請注明出處:http://en.pswp.cn/news/389102.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

軟件工程方法學要素含義_日期時間數據的要素工程

軟件工程方法學要素含義According to Wikipedia, feature engineering refers to the process of using domain knowledge to extract features from raw data via data mining techniques. These features can then be used to improve the performance of machine learning a…

洛谷P1605:迷宮(DFS)

題目背景 迷宮 【問題描述】 給定一個N*M方格的迷宮&#xff0c;迷宮里有T處障礙&#xff0c;障礙處不可通過。給定起點坐標和終點坐標&#xff0c;問: 每個方格最多經過1次&#xff0c;有多少種從起點坐標到終點坐標的方案。在迷宮中移動有上下左右四種方式&#xff0c;每次只…

vue圖片壓縮不失真_圖片壓縮會失真?快試試這幾個無損壓縮神器。

前端通常在做網頁的時候 會出現圖片加載慢的情況 在這里我通常會將圖片進行壓縮 但是通常情況下 觀眾會認為 圖片壓縮會出現失真的現象 在這里我會向大家推薦幾款圖片壓縮的工具 基本上會實現無損壓縮1.TinyPng地址&#xff1a;https://tinypng.comEnglish&#xff1f;不要慌&a…

remoteing2

此示例主要演示了net remoting,其中包含一個服務器程序Server.exe和一個客戶端程序CAOClient.exe。客戶端程序會通過http channel調用服務器端RemoteType.dll的對象和方法。服務器端的代碼文件由下圖所述&#xff1a;Server.cs源代碼 :using System;using System.Runtime.Remot…

android 線程池

為什么用線程池 創建/銷毀線程伴隨著系統開銷&#xff0c;過于頻繁的創建/銷毀線程&#xff0c;會很大程度上影響處理效率 例如&#xff1a; 記創建線程消耗時間T1&#xff0c;執行任務消耗時間T2&#xff0c;銷毀線程消耗時間T3 如果T1T3>T2&#xff0c;那么是不是說開…

datatable轉化泛型

public class ConvertHelper<T>where T:new() { /// <summary> /// 利用反射和泛型 /// </summary> /// <param name"dt"></param> /// <returns></returns> public static List<T> ConvertToList(DataTable dt) { …

【躍遷之路】【651天】程序員高效學習方法論探索系列(實驗階段408-2018.11.24)...

(收集箱&#xff08;每日一記&#xff0c;每周六整理&#xff09;)專欄 實驗說明 從2017.10.6起&#xff0c;開啟這個系列&#xff0c;目標只有一個&#xff1a;探索新的學習方法&#xff0c;實現躍遷式成長實驗期2年&#xff08;2017.10.06 - 2019.10.06&#xff09;我將以自己…

更換mysql_Docker搭建MySQL主從復制

Docker搭建MySQL主從復制 主從服務器上分別安裝Docker 1.1 Docker 要求 CentOS 系統的內核版本高于 3.10 [rootlocalhost ~]# uname -r 3.10.0-693.el7.x86_641.2 確保 yum 包更新到最新。 [rootlocalhost ~]# sudo yum update Loaded plugins: fastestmirror, langpacks Loadi…

dll文件的c++制作dll文件的c++制作

dll文件的c制作1、首先用vs2005建立一個c的dll動態鏈接庫文件&#xff0c;這時&#xff0c;// DllTest.cpp : 定義 DLL 應用程序的入口點。//#include "stdafx.h"//#include "DllTest.h"#ifdef _MANAGED#pragma managed(push, off)#endifBOOL APIENTRY Dll…

理解ConstraintLayout 對性能的好處

自從在17年GoogleI/O大會宣布了Constraintlayout,我們持續提升了布局的穩定性和布局編輯的支持。我們還為ConstraintLayout添加了一些新特性支持創建不同類型的布局&#xff0c;添加這些新特性&#xff0c;可以明顯的提升性能&#xff0c;在這里&#xff0c;我門將討論Contrain…

數據湖 data lake_在Data Lake中高效更新TB級數據的模式

數據湖 data lakeGOAL: This post discusses SQL “UPDATE” statement equivalent for a data lake (object) storage using Apache Spark execution engine. To further clarify consider this, when you need to perform conditional updates to a massive table in a relat…

如何理解運維

運維工程師&#xff08;運營&#xff09;&#xff0c;負責維護并確保整個服務的高可用性&#xff0c;同時不斷優化系統架構提升部署效率&#xff0c;優化資源利用率提高整體的投資回報率。運維工程師面對的最大挑戰是大規模集群的管理問題&#xff0c;如何管理好幾十萬臺服務器…

advanced installer更換程序id_好程序員web前端培訓分享kbone高級-事件系統

好程序員web前端培訓分享kbone高級-事件系統&#xff1a;1、用法&#xff0c;對于多頁面的應用&#xff0c;在 Web 端可以直接通過 a 標簽或者 location 對象進行跳轉&#xff0c;但是在小程序中則行不通&#xff1b;同時 Web 端的頁面 url 實現和小程序頁面路由也是完全不一樣…

ai對話機器人實現方案_顯然地引入了AI —無代碼機器學習解決方案

ai對話機器人實現方案A couple of folks from Obviously.ai contacted me a few days back to introduce their service — a completely no-code machine learning automation tool. I was a bit skeptical at first, as I always am with supposedly fully-automated solutio…

網絡負載平衡的

網絡負載平衡允許你將傳入的請求傳播到最多達32臺的服務器上&#xff0c;即可以使用最多32臺服務器共同分擔對外的網絡請求服務。網絡負載平衡技術保證即使是在負載很重的情況下它們也能作出快速響應。 網絡負載平衡對外只須提供一個IP地址&#xff08;或域名&#xff09;。 如…

透明狀態欄導致windowSoftInputMode:adjustResize失效問題

當我們通過下面代碼&#xff1a; getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); 設置狀態欄透明&#xff0c;當界面存在EditText時&#xff0c;在activity里面設置windowSoftInputMode:…

[TimLinux] JavaScript 元素動態顯示

1. css的opacity屬性 這個屬性用于&#xff1a;設置元素的不透明級別&#xff0c;取值范圍&#xff1a;從 0.0 &#xff08;完全透明&#xff09;到 1.0&#xff08;完全不透明&#xff09;&#xff0c;元素所在的文本流還在。這個屬性的動態變化可以用來設置元素的淡入淡出效果…

神經網絡 CNN

# encodingutf-8import tensorflow as tfimport numpy as npfrom tensorflow.examples.tutorials.mnist import input_datamnist input_data.read_data_sets(MNIST_data, one_hotTrue)def weight_variable(shape): initial tf.truncated_normal(shape, stddev0.1) # 定義…

圖片中的暖色或冷色濾色片是否會帶來更多點擊? —機器學習A / B測試

A/B test on ads is the art of choosing the best advertisement that optimizes your goal (number of clicks, likes, etc). For example, if you change a simple thing like a filter in your pictures you will drive more traffic to your links.廣告的A / B測試是一種選…

3d制作中需要注意的問題_淺談線路板制作時需要注意的問題

PCB電路板是電子設備重要的基礎組裝部件&#xff0c;在制作PCB電路板時&#xff0c;只有將各個方面都考慮清楚&#xff0c;才能保證電子設備在使用時不會出現問題。今天小編就與大家一起分享線路板制作時需要注意的問題&#xff0c;歸納一下幾點&#xff1a;1、考慮制作類型電路…