JS查漏补缺——ECMAScript相关

87 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情

大小写

ECMAScript中的一切都是区分大小写的,无论是变量操作符还是函数名,如:Typeof 和 typeof 是不一样的

严格模式

ES5中增加,是一种不同的JS解析和执行模型,通过在脚本开头或者函数体内部增加use strict字符这个预处理指令,开启严格模式,一些不规则的(ECMA3)写法在这里会抛出异常。 设立"严格模式"的目的,主要有以下几个:

  • 消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;
  • 消除代码运行的一些不安全之处,保证代码运行的安全;
  • 提高编译器效率,增加运行速度;
  • 为未来新版本的Javascript做好铺垫。

开启严格模式:

  • 严格模式通过在脚本或函数的头部添加 use strict; 表达式来声明。
  • use strict并不严格限制一定要写在第一行。前边无产生实际运行结果的语句,use strict可以不在第一行
// 整个脚本都开启严格模式的语法
"use strict";
var v = "Hi!  I'm a strict mode script!";
​
//单独在某个函数内开启严格模式
function a (){
    "use strict";
    //函数体
}
//use strict可以不在第一行
function(){
    "asd";
    "use strict";
    a = 1;
}

严格模式 vs 正常模式

正常模式严格模式
一个变量没有声明就赋值默认是全局变量全局变量必须显式声明(先用var命令声明,然后再使用)
对于静默失败(不报错也没有任何效果)的赋值操作 如:给NaN赋值不给效果也不报错报错
试图删除(不可删除的属性/变量/对象/函数) delete Object.prototype;不给效果也不报错报错
对象有多个重名属性允许重名属性,只有最后一个属性起作用报语法错误
函数有多个重名的参数 function f(a, a, b) { return ; }可以用arguments[i]读取报语法错误
八进制数字语法整数的第一位如果是0,表示这是八进制数,比如0100等于十进制的64禁止八进制数字语法,使用会报语法错误

补充1: 在最新的ES6中允许0o开头的八进制格式(原先0开头的八进制就不行)

var num = 0o123  // 八进制
var num2 = 0x123 // 十六进制
var num3 = 0b123 // 二进制
console.log(num,num2,num3)  //83 291 4

补充2:在讲this的指向中我们提到一般独立函数调用(默认绑定)会指向window,但在严格模式下,自执行函数(默认绑定)会指向 underfined。

function foo() {
    console.log(this)
}
foo()  // underfined

严格模式下的eval和arguments

eval

  1. 变量名不能使用 "eval" 字符串(不能通过程序语法被绑定 (be bound) 或赋值)
"use strict";
var eval = 1;         // 报错
  1. eval作用域: 在eval里面生成的变量只能用于eval内部
 "use strict";
  var a = 1;
console.info(eval("var a = 2; a"))  // 2
console.info(x)  //1eval ("var a = 2");
alert (a);               // 报错

arguments

arguments是函数的参数对象

  1. arguments 不能通过程序语法被绑定 (be bound) 或赋值
"use strict";
  arguments++; // 语法错误
  var obj = { set p(arguments) { } }; // 语法错误
  try { } catch (arguments) { } // 语法错误
  function arguments() { } // 语法错误
  var f = new Function("arguments", "'use strict'; return 17;"); // 语法错误
  1. 参数的值不会随 arguments 对象的值的改变而变化
function f(a) {
    a = 2;
    return [a, arguments[0]];
  }
  f(1); // 正常模式为[2,2]
​
  function f(a) {
    "use strict";
    a = 2;
    return [a, arguments[0]];
  }
  f(1); // 严格模式为[2,1]
  1. 不再支持 arguments.callee
"use strict";
  var f = function() { return arguments.callee; };
  f(); // 报错

🚨 ES6 的模块自动采用严格模式,不管你有没有在模块头部加上"use strict";

参考资料:
菜鸟教程:www.runoob.com/js/js-stric…
《JavaScript高级程序设计》
MDN: developer.mozilla.org/zh-CN/docs/…
阮一峰的网络日志:www.ruanyifeng.com/blog/2013/0…