1.严格模式
在程序点公布写"use strict"
①禁止给为声明的变量赋值 ------> 避免了内存泄漏和全局污染
②静默失败升级为错误 ------->静默失败,也会报错!便于调试
③普通函数调用和匿名函数自调中的this不再指向window,而是指向undefined,防止内存泄漏和全局污染
④禁止使用arguments.callee -------> 递归是使用,但为了避免紧耦合,可用循环代替
2.保护对象,控制对象的属性和结构
① 保护对象的属性
1.writable:true/false 是否可修改这个属性
2.enumerable:true/false 是否可被 for in遍历到 (但是只能防住for in,不能防住清醒访问)
3.configurable:true/false (a.是否可删除该属性 b.是否可修改前两个开关)其中configurable一旦改为false是不可逆的
② 保护对象的结构
1.防扩展:禁止添加新属性:obj.preventExtensions(obj) 默认是true
2.密封:在兼具防扩展的同时,进一步禁止删除现有属性 object.seal(obj)
3.冻结:在兼具密封的基础上,进一步禁止修改属性的值 object.freeze(obj)
3.call、apply、bind替换this所指对象
1.函数.call("要替换的对象",参数一,参数二,.......):
2. 函数.apply("要替换的对象",数组),当实参列表为一个数组的时候才用apply,通常是将数组整体传入,现讲数组打散,然后分别将参数传给原函数
3.var newobj = obj.bind() bind的用法和前两个有所区别.bind是在原函数的基础上创建一个新函数的副本,并永久替换新函数中的this为指定的对象。新函数中的this和开头部分形参,已被永久替换为固定的对象和固定的参数值。今后如果需要反复调用新函数可使用bind替换this.,只要传入可能变化的剩余几个实参值即可!