Skip to content

JS 的严格模式 #19

Description

@hashdrinker

use strict 的位置

use strict 可以放在整个脚本最前面,整个脚本都是严格模式,或函数体最前面,函数体内是严格模式。前面只能是空行或注释,否则无效

let x = 1;

'use strict'; // 放在这里无效

function fn (a, a) {
}

严格模式的影响

禁止 this 指向全局对象

非严格模式 严格模式
ES6 Module   undefined
CommonJS Module global 对象 undefined
浏览器(Chorme) window 对象 undefined

不能删除声明的变量(函数、类)

'use strict';

const x = 1;

// SyntaxError: Delete of an unqualified identifier in strict mode.
delete x;

不能使用 with 语句

'use strict';

const x = {
  a: 'a',
  b: 'b'
};

// SyntaxError: Strict mode code may not include a with statement
with (x) {
  console.log(a);
}

eval 会形成自己的局部作用域

'use strict';

var x = 1;
eval("var x = 2; console.log(x);");
console.log(x); // 1,非严格模式下是 2

eval 不能被重新赋值

'use strict';

// SyntaxError: Unexpected eval or arguments in strict mode
// 非严格模式可以赋值成功
eval = 1;

禁止八进制表示法

'use strict';

// SyntaxError: Octal literals are not allowed in strict mode.
const x = 0123;

不能对只读属性赋值

'use strict';

const x = {};

Object.defineProperty(x, 'a', {
  value: 1,
  writable: false,
  enumerable: true,
  configurable: true
});

// TypeError: Cannot assign to read only property 'a' of object '#<Object>'
x.a = 2;

不能删除不可删除的属性

'use strict';

const x = {};

Object.defineProperty(x, 'a', {
  value: 1,
  writable: false,
  enumerable: true,
  configurable: false
});

// TypeError: Cannot delete property 'a' of #<Object>
delete x.a;

函数参数不能重名

'use strict';

// SyntaxError: Duplicate parameter name not allowed in this context
function fn (a, a) {
}

arguments 不能被重新赋值

'use strict';

function x () {
  // SyntaxError: Unexpected eval or arguments in strict mode
  // 非严格模式可以赋值成功
  arguments = 1;
  console.log(arguments)
}

x();

arguments 不再追踪参数的变化

'use strict';

function x (m) {
  m = 2;
  // 2 [Arguments] { '0': 1 }
  // 非严格模式是 2 [Arguments] { '0': 2 }
  console.log(m, arguments); 
}

x(1);

不能使用 arguments.callee 

'use strict';

function x () {
  y(1);
}

function y (a) {
  // TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them
  console.log(arguments.callee);
}

x();

不能使用 函数.caller函数.arguments

'use strict';

function x () {
  y(1);
}

function y (a) {
  // TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them
  console.log(y.arguments, y.caller);
}

x();

参考

1.http://es6.ruanyifeng.com/#docs/module#严格模式
2.http://www.ruanyifeng.com/blog/2013/01/javascript_strict_mode.html

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions