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语句&严格模式的主要内容,如果未能解决你的问题,请参考以下文章

js的一些编码问题

JavaScript语言精粹_鸡肋

js性能优化

被嫌弃的eval和with

请问SQL语句中的with tie代表的含义

Linux-eval