三、JavaScript进阶-面向对象
严格模式
严格模式的概念
严格模式对正常的 JavaScript 语义做了一些更改:
1.消除了 Javascript 语法的一些不合理、不严谨之处,减少了一些怪异行为。
2.消除代码运行的一些不安全之处,保证代码运行的安全。
3.提高编译器效率,增加运行速度。
4.禁用了在 ECMAScript 的未来版本中可能会定义的一些语法,为未来新版本的 Javascript 做好铺垫。
比如一些保留字如:class, enum, export, extends, import, super 不能做变量名
开启严格模式
为脚本开启严格模式
<script> "use strict" </script> <!-- 有的 script 基本是严格模式,有的 script 脚本是正常模式,这样不利于文件合并,所以可以将整个脚本文件放在一个立即执行的匿名函数之中。这样独立创建一个作用域而不影响其他 script 脚本文件 --> <script> (function (){ "use strict"; var num = 10; function fn() {} })(); </script>
为函数开启严格模式
/** 将 "use strict" 放在函数体的第一行,则整个函数以 "严格模式" 运行 */ function fn(){ "use strict"; return "这是严格模式。"; }
严格模式的作用
变量规定
在正常模式中,如果一个变量没有声明就赋值,默认是全局变量。严格模式禁止这种用法,变量都必须先用var 命令声明,然后再使用
严禁删除已经声明变量。例如,delete x; 语法是错误的
this 指向规定
①以前在全局作用域函数中的 this 指向 window 对象。
②严格模式下全局作用域中函数中的 this 是 undefined。
③以前构造函数时不加 new 也可以调用,当普通函数,this 指向全局对象
④严格模式下,如果构造函数不加new调用, this 指向的是undefined 如果给他赋值则会报错
⑤new 实例化的构造函数指向创建的对象实例。
⑥定时器 this 还是指向 window 。
⑦事件、对象还是指向调用者。
函数规定
①函数不能有重名的参数。
②函数必须声明在顶层.新版本的 JavaScript 会引入“块级作用域”( ES6 中已引入)。为了与新版本接轨,不允许在非函数的代码块内声明函数。
闭包
闭包概念
闭包(closure)指有权访问另一个函数作用域中变量的函数
function fn(){ // fn 就是闭包函数 var num = 10; return function { console.log(num); // 10 } } var f = fn(); f()
闭包案例
var name = "The Window" let object = { name: "My Object", getNameFunc: function() { return function() { return this.name } } } console.log(object.getNameFunc()()) // The Window let name = "The Window" let object = { name: "My Object", getNameFunc: function() { let that = this return function() { return that.name } } } console.log(object.getNameFunc()()) // My Object