1. 談?wù)凧avaScript中的this。
this的指向
this表示當(dāng)前對象,this的指向是根據(jù)調(diào)用的上下文來決定的,默認(rèn)指向window對象,指向window對象時(shí)可以省略不寫,例如:this.alert() <=> window.alert()<=> alert();
調(diào)用的上下文環(huán)境包括全局和局部
1)全局環(huán)境就是在<script></script>里面,這里的this始終指向的是window對象;
2)局部環(huán)境里的this,在全局作用域下直接調(diào)用函數(shù),this指向window;
3)對象函數(shù)調(diào)用,哪個(gè)對象調(diào)用this就指向哪個(gè)對象
4)使用 new 實(shí)例化對象,在構(gòu)造函數(shù)中的this指向?qū)嵗瘜ο蟆?br>
5)使用call或apply改變this的指向
<script>
console.log(this) // 指向window對象
var a = 'this'
function fn (){
console.log(this.a)
}
fn(); // this指向window對象
var obj = {
a: 'that',
fn: fn
}
obj.fn() // this指向obj對象
function func(){
console.log(this)
}
var bar = new func() // this指向func()對象
func.call(obj) // this指向obj對象
</script>
在嚴(yán)格模式下('use strict')
function f1() {
'use strict'
console.log(this)
}
function f2() {
console.log(this)
}
f1() // this 是undefined
f2() // this 是window 對象
嚴(yán)格模式下this不允許指向全局對象是指在函數(shù)內(nèi)部
'use strict'
function fn() {
this.a = 1
}
fn() // 報(bào)錯(cuò) Uncaught TypeError: Cannot set property 'a' of undefined
JavaScript的函數(shù)調(diào)用時(shí)會(huì)隱性的接收到兩個(gè)附加的參數(shù):this和 arguments。
arguments它是JS的一個(gè)內(nèi)置對象,每一個(gè)函數(shù)都有一個(gè)arguments對象,它包括了函數(shù)所要調(diào)的參數(shù),通常我們把它當(dāng)作數(shù)組使用,用它的length得到參數(shù)數(shù)量,但它卻不是數(shù)組。
二. js嚴(yán)格模式
上面提到嚴(yán)格模式和一般模式,this指向的差異,下面來談?wù)劸褪菄?yán)格模式。
面試的時(shí)候,發(fā)現(xiàn)很多時(shí)候如果問到this之后,都沒接著問一下js的嚴(yán)格模式和一般模式的區(qū)別?
js嚴(yán)格模式:
對于 JavaScript 嚴(yán)格模式與非嚴(yán)格模式的區(qū)別,強(qiáng)烈建議大家去查看權(quán)威文檔 MDN: 嚴(yán)格模式。
ECMAScript 5的嚴(yán)格模式是采用具有限制性JavaScript變體的一種方式,從而使代碼顯示地 脫離“馬虎模式/稀松模式/懶散模式“(sloppy)模式。
嚴(yán)格模式不僅僅是一個(gè)子集:它的產(chǎn)生是為了形成與正常代碼不同的語義。
嚴(yán)格模式對正常的 JavaScript語義做了一些更改。
- 嚴(yán)格模式通過拋出錯(cuò)誤來消除了一些原有靜默錯(cuò)誤。
- 嚴(yán)格模式修復(fù)了一些導(dǎo)致 JavaScript引擎難以執(zhí)行優(yōu)化的缺陷:有時(shí)候,相同的代碼,嚴(yán)格模式可以比非嚴(yán)格模式下運(yùn)行得更快。
- 嚴(yán)格模式禁用了在ECMAScript的未來版本中可能會(huì)定義的一些語法。
嚴(yán)格模式與非嚴(yán)格模式的不同
- 嚴(yán)格模式下,不允許使用with。
- 嚴(yán)格模式下,不允許給未聲明的變量賦值。
- 嚴(yán)格模式下,arguments變?yōu)閰?shù)的靜態(tài)副本。非嚴(yán)格模式下,arguments對象里的元素和對應(yīng)的參數(shù)是指向同一個(gè)值的引用
!function(a) {
arguments[0] = 100;
console.log(a); //100
}(1);
!function(a) {
'use strict';
arguments[0] = 100;
console.log(a); //1
}(1);
但是:傳的參數(shù)是對象除外。arguments和形參共享傳遞。
!function(a) {
'use strict';
console.log(a.x); //1
arguments[0].x = 100;
console.log(a.x); //100
}({x: 1});
- 嚴(yán)格模式下,eval,arguments成為關(guān)鍵字,不能用作變量,函數(shù)名。
- 嚴(yán)格模式下,eval變成了獨(dú)立作用域。
- 嚴(yán)格模式下,刪除參數(shù)名,函數(shù)名報(bào)錯(cuò)。非嚴(yán)格模式返回false,靜默失敗。(靜默失?。翰粓?bào)錯(cuò)也沒有任何效果)
- 嚴(yán)格模式下,函數(shù)參數(shù)名重復(fù)報(bào)錯(cuò)。非嚴(yán)格模式最后一個(gè)重名參數(shù)會(huì)覆蓋之前的重名參數(shù)。
- 嚴(yán)格模式下,對象字面量重復(fù)屬性名報(bào)錯(cuò)。
!function() {
var obj = { x: 1, x: 2 };
console.log(obj.x); //2
}();
!function() {
'use strict';
var obj = { x: 1, x: 2 };
console.log(obj.x); //IE10+報(bào)錯(cuò)。IE7~9、Chrome、FF不報(bào)錯(cuò),結(jié)果為:2
}();
親測:IE10+報(bào)錯(cuò):strict 模式下不允許一個(gè)屬性有多個(gè)定義。IE7~9,Chrome,F(xiàn)F不報(bào)錯(cuò)。其他瀏覽器未測。
- 嚴(yán)格模式下,禁止八進(jìn)制字面量。
- 嚴(yán)格模式下,給只讀屬性賦值報(bào)錯(cuò)。
- 嚴(yán)格模式下,給不可擴(kuò)展對象的新屬性賦值報(bào)錯(cuò)。
- ES6中,嚴(yán)格模式下,禁止設(shè)置五種基本類型值的屬性。
- 嚴(yán)格模式下,一般函數(shù)調(diào)用(不是對象的方法調(diào)用,也不使用apply/call/bind等修改this),this指向undefined,而不是全局對象。
- 嚴(yán)格模式下,一些保留字。
在嚴(yán)格模式中一部分字符變成了保留的關(guān)鍵字。這些字符包括implements, interface, let, package, private, protected, public, static 和 yield。在嚴(yán)格模式下,你不能再用這些名字作為變量名或者形參名。
關(guān)于嚴(yán)格模式跟多或者更詳細(xì)的了解可以查看嚴(yán)格模式文檔
MDN: 嚴(yán)格模式。
相關(guān)來源博客:JavaScript嚴(yán)格模式。
"嚴(yán)格模式"的優(yōu)點(diǎn):
- 消除Javascript語法的一些不合理、不嚴(yán)謹(jǐn)之處,減少一些怪異行為;
- 消除代碼運(yùn)行的一些不安全之處,保證代碼運(yùn)行的安全;
- 提高編譯器效率,增加運(yùn)行速度;
- 為未來新版本的Javascript做好鋪墊。
- 注:經(jīng)過測試 IE6,7,8,9 均不支持嚴(yán)格模式。
缺點(diǎn):
現(xiàn)在網(wǎng)站的 JS 都會(huì)進(jìn)行壓縮,一些文件用了嚴(yán)格模式,而另一些沒有。這時(shí)這些本來是嚴(yán)格模式的文件,被 merge 后,這個(gè)串就到了文件的中間,不僅沒有指示嚴(yán)格模式,反而在壓縮后浪費(fèi)了字節(jié)。
- 使調(diào)試更加容易。那些被忽略或默默失敗了的代碼錯(cuò)誤,會(huì)產(chǎn)生錯(cuò)誤或拋出異常,因此盡早提醒你代碼中的問題,你才能更快地指引到它們的源代碼。
- 變量在賦值之前必須聲明,防止意外的全局變量。如果沒有嚴(yán)格模式,將值分配給一個(gè)未聲明的變量會(huì)自動(dòng)創(chuàng)建該名稱的全局變量。這是JavaScript中最常見的錯(cuò)誤之一。在嚴(yán)格模式下,這樣做的話會(huì)拋出錯(cuò)誤。
- 取消this值的強(qiáng)制轉(zhuǎn)換。如果沒有嚴(yán)格模式,引用null或未定義的值到 this 值會(huì)自動(dòng)強(qiáng)制到全局變量。在嚴(yán)格模式下,引用 null或未定義的 this 值會(huì)拋出錯(cuò)誤。嚴(yán)格模式下,this不會(huì)指向window
- 不允許重復(fù)的屬性名稱或參數(shù)值。當(dāng)檢測到對象中重復(fù)命名的屬性,
加油吧,切圖仔。前端深似海。