需求
画出动态线,在width设置成10时是这样的效果。
但我想动态改变线的宽度时,出现错误,且没有报错提示。
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
),
}),
})
);
在打断点进入callback函数查看时,发现两条报错
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的模块自动采用严格模式,不管你有没有在模块头部加上"use strict"
严格模式主要有以下限制:
- 变量必须声明后再使用
- 函数的参数不能有同名属性,否则报错
- 不能使用with语句
- 不能对只读属性赋值,否则报错
- 不能使用前缀0表示八进制数,否则报错
- 不能删除不可删除的属性,否则报错
- 不能删除变量delete prop ,会报错,只能删除属性 selete global[prop]
- eval 不会在它的外层作用域引入变量
- eval和arguments不能被重新赋值
- arguments不会自动反映函数参数的变化
- 不能使用****arguments.callee
- 不能使用arguments.caller
- 禁止this指向全局对象
- 不能使用fn.caller和fn.arguments获取函数调用的堆栈
- 增加了保留字(比如protected、static和interface)
上面这些限制,模块都必须遵守。由于严格模式是ES5引入的不属于ES6所以请参阅ES5书籍
其中,尤其需要注意this的限制。ES6模块之中,顶层的this指向undefined,即不应该在顶层代码使用this。
这里最简单也是最重要的答案是 use strict 是一种运行时自动执行更严格的JavaScript代码解析和错误处理的方法。如果代码错误被忽略或失败,将会产生错误或抛出异常。总的来说,这是一个很好的做法。
严格模式的一些主要有点包括:
使调试跟更容易。如果代码错误本来会被忽略或失败,那么现在将会产生错误或抛出异常,从而更快地发现代码中的问题,并更快地指引它们的源代码。
防止意外全局。如果没有严格模式,将指赋值给未声明的变量会自动创建一个具有该名称的全局变量。这是JavaScript中最常见的错误之一。在严格模式下,尝试这样做会引发错误。
消除隐藏威胁。在没有严格模式的情况下,对null或undefined的这个值得引用会自动强制到全局。这可能会导致需要headfakes和pull-out-your-hair类型的错误。在严格模式下,因公用null或undefined的这个值会引发错误。
不允许重复的参数值。严格模式在检测到函数的重复命名参数(例如,函数foo(var1,var2,var1){})时会引发错误,从而捕获代码中几乎可以肯定存在的错误,否则您可能会浪费大量的时间追踪。
注意:它曾经是(ECMAScript 5 中)strict模式将禁止重复的属性名称(例如var object = {foo:“bar”,foo:“baz”};)但是从ECMAScript 2015 开始,就不再有这种情况了。
使eval()更安全。eval()在严格模式和非严格模式下的行为方式有些不同。最重要的是,在严格模式下,在eval()语句内部声明的变量和函数不会再包含范围中创建(它们是以非严格模式在包含范围中创建的,这也可能是问的常见来源)。
抛出无效的使用错误的删除符。删除操作符(用于从对象中删除属性)不能用于对象的不可配置属性,当试图删除一个不可配置的属性时,非严格代码将自动失败,而在这种情况下,严格模式会引发错误