摘要:嚴格模式創設了第三種作用域作用域。正常模式下,指向全局對象,如果綁定的值是非對象,將被自動轉為對象再綁定上去,而和這兩個無法轉成對象的值,將被忽略嚴格模式
概述
嚴格模式是ES5進入標準的
目的是為了:
明確禁止一些不合理 不嚴謹的語法 減少JS語言的一些怪異行為
增加更多報錯的場合 保證代碼運行的安全
提高編譯效率 增加運行速度
為新版的JS語法做鋪墊
如何開啟使用一段字符串 "use strict"
全局開啟嚴格模式use strict放在JS文件的第一行,整個JS都將以嚴格模式運行
"use strict" console.log("這是嚴格模式") ---------- console.log("這是正常模式")
嚴格模式必須從代碼一開始就生效
"use strict" v=200; console.log(v) //ReferenceError: v is not defined ---------- v=200; console.log(v) //200 "use strict"函數開啟嚴格模式
use strict放在函數體的第一行,則整個函數以嚴格模式運行
function strict(){ "use strict" //開啟嚴格模式 return "這是嚴格模式" } strict() //這是嚴格模式
如果一塊代碼是嚴格模式,另一塊代碼不是,它們的合并就可能出錯。嚴格模式的代碼在前,則合并后的代碼都是嚴格模式;如果正常模式的代碼在前,則合并后的代碼都是正常模式。這兩種情況下,合并后的結果都是不正確的。這時可以把整個代碼放在一個立即執行的匿名函數之中。
(function(){ "use strict"; //其他代碼 })()顯式報錯
嚴格模式使得JS的語法變得更嚴格,更多的操作會顯式報錯。其中有些操作,在正常模式下只會靜默失敗,不會報錯
只讀屬性不可寫嚴格模式下,對只讀屬性賦值會報錯
"use strict" var obj=Object.definedProperty({},"name",{ value:"Rookie", writable:false }) obj.name="Faker"; //TypeError: Cannot assign to read only property "name" of object "#
刪除不可配置屬性也會報錯
"use strict" var obj=Object.definedProperty({},"sex",{ value:"male", configurable:false }) delete obj.sex //TypeError: Cannot delete property "sex" of #只設置了取值器的屬性不可寫
嚴格模式下,對一個只有取值器(getter)、沒有存值器(setter)的屬性賦值,會報錯
"use strict" var obj={ get v(){return 1} } obj.v=2; //TypeError: Cannot set property v of #禁止擴展的對象不可擴展
嚴格模式下,對禁止擴展的對象添加新屬性會報錯。
"use strict" var obj={} Object.preventExtensions(obj); obj.name = "object" //TypeError: Cannot add property name, object is not extensibleeval、arguments 不可用作標識名
嚴格模式下,使用eval或者arguments作為標識名,將會報錯
"use strict" var eval = 3; var arguments =4; function fn(eval){} var fun =function eval(){} var xxx=new Function("arguments","use strict",return 17) // SyntaxError: Unexpected eval or arguments in strict mode函數不能有重名的參數
正常模式下,如果函數有多個重名的參數,可以用arguments[i]讀取。嚴格模式下屬于語法錯誤
function(a,a,b){ "use strict" return a+b } // SyntaxError: Duplicate parameter name not allowed in this contextarguments的不同
嚴格模式下 arguments對象的行為有所不同
非嚴格模式下 修改命名參數的值會反應到arguments對象中
嚴格模式下 命名參數與arguments對象是完全獨立的
function fn(x){ x="Hello"; console.log(x); //Hello console.log(arguments[0]) //Hello }; fn("HOLA") ---------- function fn(x){ "use strict" x="Hello"; console.log(x); //Hello console.log(arguments[0]) //HOLA }; fn("HOLA")其他問題 禁止使用 arguments.callee
正常模式下調用沒有什么作用,但是不會報錯
var f =function(){ return arguments.callee } f()
嚴格模式明確規定,函數內部使用arguments.callee將會報錯
var f=function(){ "use strict" return arguments.callee } f() //TypeError: "caller", "callee", and "arguments" properties may not be accessed on strict mode functions or the arguments objects for calls to them禁止刪除變量
嚴格模式下無法刪除變量,如果使用delete命令刪除一個變量,會報錯
"use strict" var color ="red"; delete color //SyntaxError: Delete of an unqualified identifier in strict mode.增加
正常模式下,JavaScript 語言有兩種變量作用域(scope):全局作用域和函數作用域。嚴格模式創設了第三種作用域:eval作用域。
正常模式下,eval語句的作用域,取決于它處于全局作用域,還是函數作用域。嚴格模式下,eval語句本身就是一個作用域,不再能夠在其所運行的作用域創設新的變量了,也就是說,eval所生成的變量只能用于eval內部 eval 作用域
(function () { "use strict"; var x = 2; console.log(eval("var x = 5; x")) // 5 eval語句內部是一個獨立作用域,所以內部的變量x不會泄露到外部 console.log(x) // 2 })()禁止this指向全局對象
正常模式下,函數內部的this可能會指向全局對象,嚴格模式禁止這種用法,避免無意間創造全局變量
function f() { "use strict" console.log(this === undefined); } f() //true 嚴格模式的函數體內部this是undefined
使用構造函數時 如果沒有使用new關鍵字,這時this不再指向全局對象,而是報錯
function f(){ "use strict"; this.a=1 } f() //ReferenceError: f is not defined
嚴格模式下,函數直接調用時(不使用new調用),函數內部的this表示undefined(未定義),因此可以用call、apply和bind方法,將任意值綁定在this上面。正常模式下,this指向全局對象,如果綁定的值是非對象,將被自動轉為對象再綁定上去,而null和undefined這兩個無法轉成對象的值,將被忽略
嚴格模式
"use strict"; function fun() { return this; } console.log(fun()); //undefined console.log(fun.call(2)); //2 console.log(fun.call(true)); // true console.log(fun.call(null)); //null console.log(fun.call(undefined)); //undefined
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/96982.html
嚴格模式 首先來了解一下嚴格模式是什么?嚴格模式是JavaScript中的一種限制性更強的變種方式,不是一個子集:它在語義上與正常代碼有明顯的差異,不支持嚴格模式的瀏覽器與支持嚴格模式的瀏覽器行為上也不一樣,所以不要在未經嚴格模式特性測試情況下使用嚴格模式,嚴格模式可以與非嚴格模式共存,所以腳本可以逐漸的選擇性加入嚴格模式 嚴格模式的目的 首先,嚴格模式會將JavaScript陷阱直接變成明顯的錯...
摘要:開啟嚴格模式設置對象是一個不可擴展的對象為對象新增屬性張無忌在非嚴格模式下為不可擴展的對象添加新屬性,結果是靜默失敗。 概述 嚴格模式是什么 嚴格模式是JavaScript中的一種限制性更強的變種方式。嚴格模式不是一個子集:它在語義上與正常代碼有著明顯的差異。不支持嚴格模式的瀏覽器與支持嚴格模式的瀏覽器行為上也不一樣,所以不要在未經嚴格模式特性測試情況下使用嚴格模式。嚴格模式可以與非嚴...
摘要:嚴格模式描述嚴格模式可以分別作用在全局作用域中和函數作用域中嚴格模式是對代碼的一種限制方式嚴格模式可以將不明確顯示的錯誤轉變成明確顯示嚴格模式可以修正一些解釋器難以優化的錯誤嚴格模式下的變量禁止意外創建變量沒有開啟嚴格模式時在調用該變量時, 嚴格模式 描述 嚴格模式可以分別作用在全局作用域中和函數作用域中 嚴格模式是對JavaScript代碼的一種限制方式 嚴格模式可以將不明確顯...
摘要:概述嚴格模式是什么嚴格模式是中的一種限制性更強的變種方式。在嚴格模式下,靜默失敗會轉為報錯。拋出錯誤非嚴格模式下靜默錯誤屬性名必須唯一在嚴格模式下,一個對象內的所有屬性名必須唯一。非嚴格模式最后一個重名參數會覆蓋之前的重名參數。 概述 嚴格模式是什么 嚴格模式是JavaScript中的一種限制性更強的變種方式。嚴格模式可以和非嚴格模式共存,所以腳本可以逐漸的選擇性加入嚴格模式。 嚴格模...
摘要:反之亦然非嚴格合并嚴格看起來是非嚴格的。在普通的里面給一個拼寫錯誤的變量名賦值會使全局對象新增一個屬性并繼續工作盡管后面可能出錯在現在的中有可能。第三嚴格模式禁止刪除聲明變量。 文章整理自MSDN:https://developer.mozilla.org... 1.逐步使用嚴格模式 ECMAScript 5的嚴格模式是JavaScript中的一種限制性更強的變種方式。嚴格模式不是一個...
閱讀 3233·2021-11-22 12:07
閱讀 1876·2021-10-12 10:11
閱讀 1041·2019-08-30 15:44
閱讀 2935·2019-08-30 12:45
閱讀 2184·2019-08-29 16:41
閱讀 1636·2019-08-29 16:35
閱讀 2620·2019-08-29 12:57
閱讀 1147·2019-08-26 13:51