前端理論面試- 談?wù)則his和js嚴(yán)格模式

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語義做了一些更改。

  1. 嚴(yán)格模式通過拋出錯(cuò)誤來消除了一些原有靜默錯(cuò)誤。
  2. 嚴(yán)格模式修復(fù)了一些導(dǎo)致 JavaScript引擎難以執(zhí)行優(yōu)化的缺陷:有時(shí)候,相同的代碼,嚴(yán)格模式可以比非嚴(yán)格模式下運(yùn)行得更快。
  3. 嚴(yán)格模式禁用了在ECMAScript的未來版本中可能會(huì)定義的一些語法。

嚴(yán)格模式與非嚴(yán)格模式的不同

  1. 嚴(yán)格模式下,不允許使用with。
  2. 嚴(yán)格模式下,不允許給未聲明的變量賦值。
  3. 嚴(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});
  1. 嚴(yán)格模式下,eval,arguments成為關(guān)鍵字,不能用作變量,函數(shù)名。
  2. 嚴(yán)格模式下,eval變成了獨(dú)立作用域。
  3. 嚴(yán)格模式下,刪除參數(shù)名,函數(shù)名報(bào)錯(cuò)。非嚴(yán)格模式返回false,靜默失敗。(靜默失?。翰粓?bào)錯(cuò)也沒有任何效果)
  4. 嚴(yán)格模式下,函數(shù)參數(shù)名重復(fù)報(bào)錯(cuò)。非嚴(yán)格模式最后一個(gè)重名參數(shù)會(huì)覆蓋之前的重名參數(shù)。
  5. 嚴(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ò)。其他瀏覽器未測。

  1. 嚴(yán)格模式下,禁止八進(jìn)制字面量。
  2. 嚴(yán)格模式下,給只讀屬性賦值報(bào)錯(cuò)。
  3. 嚴(yán)格模式下,給不可擴(kuò)展對象的新屬性賦值報(bào)錯(cuò)。
  4. ES6中,嚴(yán)格模式下,禁止設(shè)置五種基本類型值的屬性。
  5. 嚴(yán)格模式下,一般函數(shù)調(diào)用(不是對象的方法調(diào)用,也不使用apply/call/bind等修改this),this指向undefined,而不是全局對象。
  6. 嚴(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):

  1. 消除Javascript語法的一些不合理、不嚴(yán)謹(jǐn)之處,減少一些怪異行為;
  2. 消除代碼運(yùn)行的一些不安全之處,保證代碼運(yùn)行的安全;
  3. 提高編譯器效率,增加運(yùn)行速度;
  4. 為未來新版本的Javascript做好鋪墊。
  5. 注:經(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é)。

  1. 使調(diào)試更加容易。那些被忽略或默默失敗了的代碼錯(cuò)誤,會(huì)產(chǎn)生錯(cuò)誤或拋出異常,因此盡早提醒你代碼中的問題,你才能更快地指引到它們的源代碼。
  2. 變量在賦值之前必須聲明,防止意外的全局變量。如果沒有嚴(yán)格模式,將值分配給一個(gè)未聲明的變量會(huì)自動(dòng)創(chuàng)建該名稱的全局變量。這是JavaScript中最常見的錯(cuò)誤之一。在嚴(yán)格模式下,這樣做的話會(huì)拋出錯(cuò)誤。
  3. 取消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
  4. 不允許重復(fù)的屬性名稱或參數(shù)值。當(dāng)檢測到對象中重復(fù)命名的屬性,

加油吧,切圖仔。前端深似海。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 概要 64學(xué)時(shí) 3.5學(xué)分 章節(jié)安排 電子商務(wù)網(wǎng)站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,793評論 0 3
  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,667評論 0 4
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML標(biāo)準(zhǔn)。 注意:講述HT...
    kismetajun閱讀 28,774評論 1 45
  • 第一章: JS簡介 從當(dāng)初簡單的語言,變成了現(xiàn)在能夠處理復(fù)雜計(jì)算和交互,擁有閉包、匿名函數(shù), 甚至元編程等...
    LaBaby_閱讀 1,751評論 0 6
  • 函數(shù)和對象 1、函數(shù) 1.1 函數(shù)概述 函數(shù)對于任何一門語言來說都是核心的概念。通過函數(shù)可以封裝任意多條語句,而且...
    道無虛閱讀 4,927評論 0 5

友情鏈接更多精彩內(nèi)容