Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ES5严格模式及限制 #9

Open
hubvue opened this issue Dec 19, 2018 · 0 comments
Open

ES5严格模式及限制 #9

hubvue opened this issue Dec 19, 2018 · 0 comments

Comments

@hubvue
Copy link
Owner

hubvue commented Dec 19, 2018

严格模式

严格模式给作者提供了选择一个限制性更强语言变种的方式。

开启严格模式:在js文件或者函数顶部加上"use strict"。开启严格模式有两种方法:

  1. 全局严格模式:
"use strict"
  1. 函数内部严格模式:
function foo(){
    "use strict"
}

严格模式做了哪些限制

  1. 变量:使用变量但不声明
testvar = 4      //报错:严格模式下不允许未声明使用变量
  1. 只读属性:写入只读属性
 testObject = {};
Object.defineProperty(testObject,"name",{
    value : "wang",
    writable:false,
})
testObject.name = "zhou";   //报错,严格模式下不允许分配只读属性
  1. 不可扩展的属性: 将属性描述的extensible属性设置为false。
var testObj = new Object();
Object.preventExtensions(testObj);
testObj.name = "wang";  //报错,严格模式下,无法为不可扩展的对象创建属性
  1. delete删除变量、函数或者参数。删除configurable特性设置为false的属性。
var testvar = 10;
delete testvar;  //报错,严格模式不允许删除变量
function fun(){};
delete fun;         //报错,严格模式下不允许删除函数
var testObj = {};
Object.defineProperty(testObj,"name",{
    configurable : false,
})
delete testObj.name;        //报错,严格模式不允许删除对象属性的描述configurable为false的属性。
  1. 重复属性:在一个对象文本中国多次定义某个属性。
var testObj = {
    prop1 = 10,
    prop1 = 10,             //报错,严格模式不允许对象定义相同的属性。
}
  1. 重复参数名:在一个函数中多次使用相同的参数名。
function test (name,name) {         //报错,严格模式不允许函数定义相同的函数名。
    return 1;
}
  1. 未来保留字:将未来保留关键字用作变量或者函数名。
//implements、interface 、package、private、protected、public、static、yield。
  1. 八进制数: 对数值的分配八进制值,或尝试对八进制值使用转义。
var testvar = 010;  //报错
var testvar1 = \010;    //报错
  1. this:当this的值为null或者undefined的时候,该值不会转换为全局对象。
function testFunc(){
console.log(this)       //非严格模式下,this指向window
//严格模式下,this为undefined
} 
  1. 作为标示符的eval:字符串eval不能作为标识符(变量或函数名、参数名)。
// var eval = 10;      //报错

11.语句或块中声明函数 : 无法再语句或者块中声明函数

for(var i = 0 ; i<5 ; i++) {
    function tes(){}            //没有报错
}
if(true){
    function test(){    //没报错
    }
}
  1. eval函数内声明的变量:如果在eval函数内声明的变量,则不能再次函数外部使用该变量
eval("var testvar = 10");
console.log(testvar = 5);       //报错,严格模式下,eval用法无效
  1. 作为标识符的Arguments : 字符串的arguments不能作为标识符(变量或函数名参数名)
var arguments = 10;     //报错
function arguments(){};     //报错
  1. 函数内的arguments : 无法更改本地的arguments对象的成员的值。
function test(name){
    arguments[0] = 1;
    console.log(name);      //wang 不变
}
test("wang")
  1. arguments.callee : 不允许使用
function test(){
    arguments.callee();         //报错
}
test();
  1. with: 不允许使用
with(Math){
    x = cos(3);     //报错,严格模式下,不允许使用with
    y = tan(7);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant