with语句
with语句用于扩展一个语句的作用域链。
// "use strict" ; //开启严格模式以后,with就直接报错了。
var message = "Hello World"
//****with语句不推荐使用,因为它会混淆一些错误******
//with语句:可以形成自己的作用域
// function foo(){
// console.log(message); //AO里没有,会沿着作用域链到GO里去找
// function bar(){
// console.log(message);
// }
// bar()
// }
// foo()
var obj = {name:'harry',age:18,message:'obj里的message'}
function foo(){
console.log(message); //AO里没有,会沿着作用域链到GO里去找
function bar(){
with(obj){ //用法with(对象):{}
console.log(message); //with会形成作用域,先从obj里面找
console.log('-------------');
}
}
bar()
}
foo()
不建议使用with语句,因为它可能是混淆错误和兼容性问题的根源。
eval函数
eval是一个特殊的函数,它可以将传入的字符串当做JavaScript代码来运行。
eval函数在webpack里会看到,webpack的devtool属性可以设置成eval,这样就会把所有代码转换成eval这种字符串,这种性能很高。
// eval是一个特殊的函数
// var message = "Hello World"
// console.log(message);
var jsString = 'var message = "Hello";console.log(message)' //这个要加分号的,不然识别不出来。
eval(jsString)
//不建议使用eval:1.可读性非常差,eval是个字符串,很容易被篡改,3.eval执行必须经过JS解释器,不能被JS引擎优化
缺点:
- eval代码的可读性非常的差(代码的可读性是高质量代码的重要原则)
- eval是一个字符串,那么有可能在执行的过程中被刻意篡改,那么可能会造成被攻击的风险
- eval的执行必须经过JS解释器,不能被JS引擎优化
严格模式
在ECMAScript5标准中,JavaScript提出了严格模式的概念(Strict Mode)。严格模式很好理解,是一种具有限制性的JavaScript模式,从而使代码隐式的脱离了 ”懒散(sloppy)模式“; 支持严格模式的浏览器在检测到代码中有严格模式时,会以更加严格的方式对代码进行检测和执行。
// 'use strict' //这就开启了严格模式了
//js本身是非常灵活的
// var name = 'harry'
// message = 'harry'
// 123.name = '333' //这些都是安全隐患
//严格模式通过抛出错误来消除一些原有的静默(silent)错误
//严格模式让JS引擎在执行代码时可以进行更多的优化(不需要对一些特殊的语法进行处理)
//严格模式禁用了ECMAScript未来版本中可能会定义的一些语法 (比如以前保留字是可以被定义为变量名的)
//开启严格模式
//可以给某个js文件开启严格模式
//给某个函数开启严格模式
// message = "Hello world"
// console.log(message);
// //静默错误,本来错的,但是因为js很松散,就没报错
// // true.foo = "abc"
// 'use strict'
// message = 'Hello World'
// console.log(message); //报错了
//单独给某个函数加严格模式
// function foo(){
// "use strict" //将静默错误报错了
// true.foo = "bac"
// }
// foo()
"use strict"
// 1.禁止意外创建全局变量
message = "Hello World"
console.log(message);
function foo(){
age = 20
}
foo()
//2.不允许函数有相同的参数名称
function foo(x,y,x){
console.log(x,y,x);
}
foo(10,20,30)
//3.静默错误
true.name = "abd"
NaN = 123
var obj = {}
Object.defineProperty(obj,"name",{
writable:false,
value:'why'
})
console.log(obj.name);
obj.name = '13' //报错,如果去掉严格模式,它啥也不做但是不报错
//4.不允许使用原先的八进制格式 o123
var num = 0o123
var num2 = 0x123
var num3 = 0b100 //这些是ES6之后的,这个可以,但是像o123,直接报错
//5.with语句不允许使用
//6.eval函数不会向上引用变量了
var jsString = 'var message = "Hello"'
eval(jsString)
console.log(message); //向上引用变量,开启严格模式就不能向上引用变量了。
严格模式下的this
"use strict"
//在严格模式下,自执行函数指向undefined
//之前编写的代码中,自执行函数我们是没有使用过this直接去引用window
function foo(){
console.log(this);
}
foo()
var obj = {
name:'why',
foo:foo
}
foo()//undefined
obj.foo() //不变