Skip to content

面试题

1. 动态执行JS有哪些方式?

注意:以下方式都受CSP策略限制,不能在严格模式下使用。

js
// 1. eval函数, 局部作用域
eval('console.log(123)');

// 2. new Function构造函数, 全局作用域
const fn = new Function('console.log(456)');
fn();

// 3. setTimeout和setInterval, 全局作用域
setTimeout('console.log(789)', 0);

// 4. 动态创建script标签, 全局作用域
const script = document.createElement('script');
script.textContent = 'console.log(101112)';
document.head.appendChild(script);

2. 以下的输出是什么?

js
var a = { n: 1};  // 1
var b = a; // 2
a.x = a = { n: 2 }; // 3

console.log(a.x); // undefined
console.log(b.x); // { n: 2 }

这里考查的是赋值操作的顺序,第3步中,可以看成是以下两步:

  1. a.x = (a = {n: 2}),这里的a.x取的地址值已固定, 实际就是b.x,不受后面赋值的影响
  2. 当给a赋值后再给a.x赋值,这里a变了,但是a.x实际也是b.x。、

3. var, let, const 区别?

  1. 作用域不同:var 是函数作用域,let 和 const 是块级作用域。
  2. 变量提升不同:var 存在变量提升,let 和 const 不存在变量提升。
  3. 重复声明不同:var 可以重复声明,let 和 const 不可以重复声明。
  4. 赋值不同:var 可以在声明前赋值,let 和 const 必须在声明后赋值。
  5. const 声明的变量必须初始化,且不能被重新赋值,但如果是对象或数组,可以修改其属性或元素。
  6. var在全局作用域下声明的变量会成为全局对象的属性,而let和const声明的变量不会。