需求
畫出動態(tài)線,在width設(shè)置成10時是這樣的效果丈冬。
但我想動態(tài)改變線的寬度時碍拆,出現(xiàn)錯誤性芬,且沒有報錯提示母谎。
let width = 10;
let polyline = new Cesium.PolylineGeometry({
positions: Cesium.Cartesian3.fromDegreesArrayHeights([
113.2312,
23.1172,
5,
113.2315,
23.1178,
5,
113.2321,
23.1176,
5,
]),
width: new Cesium.CallbackProperty(function (time, result) {
switch (true) {
case width == 10:
width += 5;
break;
case width > 10:
width += 3;
break;
case width > 20:
width -= 7;
break;
default:
width = 10;
break;
}
console.log("time:", time, "result:", result, "width:", width);
return width;
}, false),
vertexFormat: Cesium.PolylineMaterialAppearance.VERTEXT_FORMAT,
});
this.viewer.scene.primitives.add(
new Cesium.Primitive({
geometryInstances: new Cesium.GeometryInstance({
geometry: polyline,
}),
appearance: new Cesium.PolylineMaterialAppearance({
material: Cesium.Material.fromType(
Cesium.Material.PolylineGlowType
),
}),
})
);
在打斷點(diǎn)進(jìn)入callback函數(shù)查看時瘦黑,發(fā)現(xiàn)兩條報錯
TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them at Function
ES6的模塊自動采用嚴(yán)格模式,不管你有沒有在模塊頭部加上"use strict"
嚴(yán)格模式主要有以下限制:
- 變量必須聲明后再使用
- 函數(shù)的參數(shù)不能有同名屬性奇唤,否則報錯
- 不能使用with語句
- 不能對只讀屬性賦值幸斥,否則報錯
- 不能使用前綴0表示八進(jìn)制數(shù),否則報錯
- 不能刪除不可刪除的屬性咬扇,否則報錯
- 不能刪除變量delete prop 甲葬,會報錯,只能刪除屬性 selete global[prop]
- eval 不會在它的外層作用域引入變量
- eval和arguments不能被重新賦值
- arguments不會自動反映函數(shù)參數(shù)的變化
- 不能使用****arguments.callee
- 不能使用arguments.caller
- 禁止this指向全局對象
- 不能使用fn.caller和fn.arguments獲取函數(shù)調(diào)用的堆棧
- 增加了保留字(比如protected懈贺、static和interface)
上面這些限制经窖,模塊都必須遵守。由于嚴(yán)格模式是ES5引入的不屬于ES6所以請參閱ES5書籍
其中隅居,尤其需要注意this的限制钠至。ES6模塊之中,頂層的this指向undefined胎源,即不應(yīng)該在頂層代碼使用this棉钧。
這里最簡單也是最重要的答案是 use strict 是一種運(yùn)行時自動執(zhí)行更嚴(yán)格的JavaScript代碼解析和錯誤處理的方法。如果代碼錯誤被忽略或失敗涕蚤,將會產(chǎn)生錯誤或拋出異常宪卿。總的來說万栅,這是一個很好的做法佑钾。
嚴(yán)格模式的一些主要有點(diǎn)包括:
使調(diào)試跟更容易。如果代碼錯誤本來會被忽略或失敗烦粒,那么現(xiàn)在將會產(chǎn)生錯誤或拋出異常休溶,從而更快地發(fā)現(xiàn)代碼中的問題代赁,并更快地指引它們的源代碼。
防止意外全局兽掰。如果沒有嚴(yán)格模式芭碍,將指賦值給未聲明的變量會自動創(chuàng)建一個具有該名稱的全局變量。這是JavaScript中最常見的錯誤之一孽尽。在嚴(yán)格模式下窖壕,嘗試這樣做會引發(fā)錯誤。
消除隱藏威脅杉女。在沒有嚴(yán)格模式的情況下瞻讽,對null或undefined的這個值得引用會自動強(qiáng)制到全局。這可能會導(dǎo)致需要headfakes和pull-out-your-hair類型的錯誤熏挎。在嚴(yán)格模式下速勇,因公用null或undefined的這個值會引發(fā)錯誤。
不允許重復(fù)的參數(shù)值婆瓜。嚴(yán)格模式在檢測到函數(shù)的重復(fù)命名參數(shù)(例如快集,函數(shù)foo(var1,var2廉白,var1){})時會引發(fā)錯誤个初,從而捕獲代碼中幾乎可以肯定存在的錯誤,否則您可能會浪費(fèi)大量的時間追蹤猴蹂。
注意:它曾經(jīng)是(ECMAScript 5 中)strict模式將禁止重復(fù)的屬性名稱(例如var object = {foo:“bar”院溺,foo:“baz”};)但是從ECMAScript 2015 開始磅轻,就不再有這種情況了珍逸。
使eval()更安全。eval()在嚴(yán)格模式和非嚴(yán)格模式下的行為方式有些不同聋溜。最重要的是谆膳,在嚴(yán)格模式下,在eval()語句內(nèi)部聲明的變量和函數(shù)不會再包含范圍中創(chuàng)建(它們是以非嚴(yán)格模式在包含范圍中創(chuàng)建的撮躁,這也可能是問的常見來源)漱病。
拋出無效的使用錯誤的刪除符。刪除操作符(用于從對象中刪除屬性)不能用于對象的不可配置屬性把曼,當(dāng)試圖刪除一個不可配置的屬性時杨帽,非嚴(yán)格代碼將自動失敗,而在這種情況下嗤军,嚴(yán)格模式會引發(fā)錯誤