JS额外知识补充:with语句&eval语句&严格模式
Posted 还是不会呀
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS额外知识补充:with语句&eval语句&严格模式相关的知识,希望对你有一定的参考价值。
javascript额外知识补充:with语句、eval语句和严格模式
with语句
with语句也有自己的作用域,当在传入的对象内没有找到变量时,再到上一层作用域内查找。
const info = {
message: "info",
};
const message = "window";
const age = 21;
with (info) {
console.log(message);
console.log(age);
}
❗️ 注意:不建议使用with语句,可能存在混淆错误和兼容性的问题
eval语句
将一段字符串当作js代码来执行。
var str = 'var message = "hello eval !";console.log(message);';
eval(str); // hello eval !
弊端:
- eval代码解析的是字符串,并且执行。当代码字符串太多时,代码的可读性下降。
- 安全性问题:如果网络攻击者在要解析的字符串内拼接上恶意代码,会造成安全问题。
- js引擎是会对代码进行解析优化的,但是js引擎并不会对eval的字符串进行优化。
严格模式
JavaScript代码是非常灵活的,有些错误本就是不符合规则的,但浏览器并不会对其做出响应。严格模式开启,将会以一种严格的代码执行方案,对代码进行检测和执行。
严格模式支持粒度化
- 支持在js文件内开启严格模式。
- 支持单独对某一个函数开启严格模式。
// js文件开启严格模式
"use strict";
var name = "fzb";
console.log(name);
// 单独给某一个函数开启严格模式
function foo() {
"use strict";
var message = "foo函数.";
console.log(message);
}
foo();
严格模式的限定
❗️ 以下举例都是错误例子
禁止意外创建全局变量,非严格模式是允许的
"use strict";
message = "hello word!";
console.log(message);
不允许函数具有相同的参数
"use strict";
function foo(n, m, n) {
console.log(n, m, n);
}
foo(1, 2, 3);
静默错误
"use strict";
// true本就不能再挂载属性的
true.message = "hello word!";
var obj = {};
Object.defineProperty(obj, "name", {
value: "fzb",
writable: false,
});
console.log(obj); // { name:"fzb" }
// 虽然赋值没有起到作用,但是在非严格模式下,浏览器也是不处理的
obj.name = "coderbin";
console.log(obj); // { name:"fzb" }
不允许使用原先的八进制
"use strict";
// 八进制的123,非严格模式下可以这样使用
var num = 0123;
console.log(num);
不允许使用with语句
"use strict";
var info = {
name: "fzb",
};
with (info) {
console.log(name);
}
eval语句不再为上层引用变量
var str = '"use strict";var message="hello world!";console.log(message);';
eval(str);
// 非严格模式下message会放置到window对象上的
console.log(message);
严格模式下的this指向
🔗 严格模式下四条规则内的默认绑定规则有所改变。
"use strict";
function foo() {
// 理论上应该打印的是 window 但是在严格模式下打印的是 undefined
console.log(this);
}
foo();
以上是关于JS额外知识补充:with语句&eval语句&严格模式的主要内容,如果未能解决你的问题,请参考以下文章