js嚴格模式下的this指向,es6模組預設使用嚴格模式
一、問題描述
有這麼一段程式碼,他的執行結果是什麼呢?
class A {
print() {
console.log("==>", this);
}
}
var aa = new A();
var print = aa.print;
aa.print();
print();
二、解題思路
我們一眼略過,迅速說出了答案
//A{}
//window{}
很遺憾,不對。答案是
//A{}
//undefined
這是為毛啊?肯定瀏覽器有毛病,那麼我們把這段程式碼用babel轉一下,轉成es5的形式,看看有什麼貓膩。
var A = /*#__PURE__*/function () {
"use strict";
function A() {}
var _proto = A.prototype;
_proto.print = function print() {
console.log("==>", this);
};
return A;
}();
var aa = new A();
var print = aa.print;
aa.print();
print();
上面自動加了嚴格模式,後來查閱資料知道
ES6 的模組自動採用嚴格模式,不管你有沒有在模組頭部加上"use strict";。
類或者一個js檔案就是一個模組,所以會自動使用嚴格模式。
嚴格模式主要有以下限制。
- 變數必須宣告後再使用;
- 函式的引數不能有同名屬性,否則報錯;
- 不能使用with語句;
- 不能對只讀屬性賦值,否則報錯;
- 不能使用字首0表示八進位制數,否則報錯;
- 不能刪除不可刪除的屬性,否則報錯;
- 不能刪除變數delete prop,會報錯,只能刪除屬性delete global[prop];
- eval不會在它的外層作用域引入變數;
- eval和arguments不能被重新賦值;
- arguments不會自動反映函式引數的變化;
- 不能使用arguments.callee;
- 不能使用arguments.caller;
禁止this指向全域性物件
;- 不能使用fn.caller和fn.arguments獲取函式呼叫的堆疊;
- 增加了保留字(比如protected、static和interface)。
好,其他的我們日後再看,我們提取關鍵資訊 - 禁止this指向全域性物件
;
這是什麼意思呢?也就是當我們沒有指定函式的呼叫者時,函式不會預設指向全域性物件window
下面舉個例子
"use strict";
function f() {
console.log(this);
}
f()//log: undefined
window.f()//log: window{}
三、總結
這題答錯的主要原因是因為,我不知道es6會預設使用嚴格模式。以及嚴格模式的一些特點,瞭解之後發現也沒有這麼燒腦,還是知識儲量太少,要多加練習哦。。
相關文章
- 嚴格模式和非嚴格模式區別模式
- 嚴格模式模式
- JS專題之嚴格模式JS模式
- JavaScript嚴格模式JavaScript模式
- JS 基礎篇(五):JS嚴格模式JS模式
- 嚴格模式use strict模式
- JavaScript 中的 嚴格模式JavaScript模式
- JSON.parse () 的非嚴格模式JSON模式
- JavaScript嚴格模式(三)- 物件的禁止操作JavaScript模式物件
- web基礎(四)嚴格模式與混雜模式Web模式
- MySQL SELECT list is not in...MySQL關閉嚴格模式MySql模式
- 使用React嚴格模式避免過時的程式碼和副作用React模式
- 你不知道的JavaScript--Item1 嚴格模式JavaScript模式
- 好程式設計師web前端教程之詳解JavaScript嚴格模式程式設計師Web前端JavaScript模式
- 聊一聊JavaScript中的嚴格模式與相關的‘坑’JavaScript模式
- JS設計模式三:模組模式JS設計模式
- 面試— !Doctype的作用,嚴格模式和混雜模式的區別、以及如何觸發兩種模式面試模式
- Doctype的作用?嚴格模式與混合模式,如何觸發者這兩種模式,區分它們有何意義?模式
- 補充上一篇,嚴格模式下不同場景下函式引數名的區別模式函式
- 寬鬆相等( == )與嚴格相等( === )
- js設計模式–組合模式JS設計模式
- js設計模式--組合模式JS設計模式
- 寬鬆相等和嚴格相等(==和===)
- 為什麼實時分析既需要NoSQL的靈活性,又需要SQL系統的嚴格模式?SQL模式
- 如何設定一個嚴格30分鐘過期的SessionSession
- [譯] 在JS中,如何讓(a===1 && a===2 && a === 3)(嚴格相等)的值為true?JS
- [BJWC2010] 嚴格次小生成樹
- 測試流程必須嚴格執行嗎?
- 嚴格單元測試造就完美軟體
- 使用Docker Swarm模式路由網格DockerSwarm模式路由
- 預設方法的使用模式模式
- Python程式設計過程的中的規範!一定要嚴格自己遵循!Python程式設計
- 規格模式(Specification Pattern)模式
- 如何將 Elixir 模組風格應用在 JS 中JS
- 為什麼要使用模組模式?模式
- js設計模式–命令模式JS設計模式
- js設計模式--命令模式JS設計模式
- js設計模式--代理模式JS設計模式