像淘寶類別網(wǎng)站怎么做谷歌優(yōu)化是什么意思
目錄
1.嚴(yán)格模式
1.1嚴(yán)格模式的概念:
1.2嚴(yán)格模式在語(yǔ)義上更改的地方:
1.3如何開(kāi)啟嚴(yán)格模式?
1.4嚴(yán)格模式應(yīng)用上的變化?
2.原型鏈
1.嚴(yán)格模式
1.1嚴(yán)格模式的概念:
? ? ? 嚴(yán)格模式有點(diǎn)像es5向es6過(guò)渡而產(chǎn)生的一種模式,因?yàn)閑s6的語(yǔ)法要求都比較嚴(yán)格,而我們?cè)趀s5的代碼編寫(xiě)過(guò)程中使用嚴(yán)格模式會(huì)使得我們的代碼更加規(guī)范,但并不是所有的瀏覽器都支持嚴(yán)格模式,只有在IE10以上版本的瀏覽器才會(huì)支持嚴(yán)格模式。
1.2嚴(yán)格模式在語(yǔ)義上更改的地方:
嚴(yán)格模式對(duì)正常的 JavaScript 語(yǔ)義做了一些更改:
- 消除了 Javascript 語(yǔ)法的一些不合理、不嚴(yán)謹(jǐn)之處,減少了一些怪異行為。
- 消除代碼運(yùn)行的一些不安全之處,保證代碼運(yùn)行的安全。
- 提高編譯器效率,增加運(yùn)行速度。
- 禁用了在 ECMAScript 的未來(lái)版本中可能會(huì)定義的一些語(yǔ)法,為未來(lái)新版本的 Javascript 做好鋪墊。比如一些保留字如:class,enum,export, extends, import, super 不能做變量名
1.3如何開(kāi)啟嚴(yán)格模式?
"use strict" //開(kāi)啟嚴(yán)格模式,
//或者在函數(shù)內(nèi)部
function(){
"use strict" //需要寫(xiě)在函數(shù)體內(nèi)所有語(yǔ)句之前
}
如果將該語(yǔ)句直接寫(xiě)在script標(biāo)簽內(nèi)部則表示開(kāi)啟全局嚴(yán)格模式。如果是寫(xiě)在函數(shù)內(nèi)部,則表示在函數(shù)作用域內(nèi)編寫(xiě)的代碼開(kāi)啟嚴(yán)格模式。?
1.4嚴(yán)格模式應(yīng)用上的變化?
(1)未聲明的變量直接賦值輸出會(huì)報(bào)錯(cuò)。(普通模式下不會(huì)報(bào)錯(cuò),會(huì)將變量前面默認(rèn)加上window然后將變量升為全局變量,可以在控制臺(tái)輸出變量的值)
"use strict" //開(kāi)啟嚴(yán)格模式,如果寫(xiě)在函數(shù)體內(nèi)部則表示只有函數(shù)內(nèi)部開(kāi)啟嚴(yán)格模式。a = 10;console.log(a);//嚴(yán)格模式之前可以輸出a的值,現(xiàn)在會(huì)直接報(bào)錯(cuò)。
(2)不允許刪除變量 (普通模式下變量沒(méi)有真的被刪除,但是也不會(huì)報(bào)錯(cuò))
"use strict" //開(kāi)啟嚴(yán)格模式,如果寫(xiě)在函數(shù)體內(nèi)部則表示只有函數(shù)內(nèi)部開(kāi)啟嚴(yán)格模式。 var b = 1;delete b;//嚴(yán)格模式下不可以刪除變量,會(huì)直接報(bào)語(yǔ)法錯(cuò)誤。
?(3)函數(shù)的this指向是undefined(普通模式下,普通函數(shù)的this指向window)
<script>"use strict" //開(kāi)啟嚴(yán)格模式,如果寫(xiě)在函數(shù)體內(nèi)部則表示只有函數(shù)內(nèi)部開(kāi)啟嚴(yán)格模式。function fn() {console.log(this); //嚴(yán)格模式下函數(shù)內(nèi)this指向undefined}fn();</script>
(4) 構(gòu)造函數(shù)不加new調(diào)用,指向結(jié)果為undefined,(普通模式下,如果構(gòu)造函數(shù)不使用 new
調(diào)用,this
的指向?qū)⑷Q于調(diào)用上下文。在非嚴(yán)格模式下,如果沒(méi)有使用 new
,而是將構(gòu)造函數(shù)作為普通函數(shù)進(jìn)行調(diào)用,this
會(huì)指向全局對(duì)象(在瀏覽器環(huán)境中是 window
對(duì)象)。)
'use strict';function Person(name) {this.name = name;}var person1 = new Person('Alice');console.log(person1.name); // 輸出 "Alice"var person2 = Person('Bob'); // 沒(méi)有使用 new 關(guān)鍵字調(diào)用構(gòu)造函數(shù) 此時(shí)由于沒(méi)有使用 new 關(guān)鍵字,this 被設(shè)置為 undefined。在這種情況下,嘗試給 undefined.name 賦值會(huì)導(dǎo)致報(bào)錯(cuò),因?yàn)?undefined 沒(méi)有 name 屬性。console.log(person2); // 輸出 undefined
?(5)無(wú)論是不是在嚴(yán)格模式下,定時(shí)器的this指向都是window。
setTimeout(function() {console.log(this); //嚴(yán)格模式下,定時(shí)器 this 還是指向 window
}, 2000);
2.原型鏈
<script>// 父親 (構(gòu)造函數(shù))function Person(name, age) {this.name = name;this.age = age;this.say = function () {console.log('say person');}}// Person.prototype是原型對(duì)象 是一塊空間 母親 有 constructor屬性和 __proto__屬性Person.prototype.say = function () {console.log('asy');}Person.prototype.walk = function () {console.log('walk');}// 孩子 實(shí)例對(duì)象 有 constructor屬性和 __proto__屬性var p1 = new Person('TOM', 20);var p2 = new Person('JACK', 22);console.log(p1);p1.say();p2.say();</script>
可以簡(jiǎn)單的理解為構(gòu)造函數(shù)類似于父親的角色,原型對(duì)象類似于母親的角色,而實(shí)例對(duì)象類似于孩子的角色。?
?父親(構(gòu)造器)有prototype 屬性,父親(構(gòu)造器)可以通過(guò)prototype 屬性查找到母親(原型對(duì)象)。
母親(原型對(duì)象)有 constructor(構(gòu)造器)屬性和 __proto__(隱式原型)屬性,母親可以通過(guò)construtor屬性來(lái)查找到父親(構(gòu)造函數(shù))。同時(shí)可以通過(guò) __proto__(隱式原型)屬性來(lái)查找到父級(jí)函數(shù)的原型對(duì)象,而父級(jí)函數(shù)的原型對(duì)象再通過(guò) __proto__(隱式原型)屬性網(wǎng)上查找又可以找到上一級(jí)函數(shù)的原型對(duì)象,直到找到最頂部的原型對(duì)象,此時(shí)再向上查找的結(jié)果就是null。
孩子(實(shí)例對(duì)象)有 constructor(構(gòu)造器)屬性和 __proto__(隱式原型)屬性,孩子可以通過(guò) __proto__(隱式原型)屬性查找到母親(原型對(duì)象),然后再通過(guò) construtor(構(gòu)造器)屬性查找到父親(構(gòu)造函數(shù))或__proto__(隱式原型)屬性查找到上級(jí)母親(原型對(duì)象)。