JavaScript高级第三天(笔记总结)(一)

简介: JavaScript高级第三天(笔记总结)

今日目标

  • 能够说出函数的多种定义和调用方式
  • 能够说出和改变函数内部 this 的指向
  • 能够说出严格模式的特点
  • 能够把函数作为参数和返回值传递
  • 能够说出闭包的作用
  • 能够说出递归的两个条件
  • 能够说出深拷贝和浅拷贝的区别


一、函数的定义和调用

1、函数的定义方式
  • 函数声明方式 function 关键字(命名函数)
  • 函数表达式(匿名函数)
  • new Function()


语法:

var fn = new Function('参数1','参数2'..., '函数体')


注意:

1、Function 里面参数都必须是字符串格式

2、第三种方式执行效率低,也不方便书写,因此较少使用

3、所有函数都是 Function 的实例(对象)

4、函数也属于对象

814200876e314bc28c8b6f5953ef5cfc.png


2、函数的调用方式
  • 普通函数
function fn() {
  console.log('人生的巅峰'); 
}
fn();
fn.call();


  • 对象的方法
var o = {
  sayHi: function() { console.log('人生的巅峰') }
}
o.sayHi();


  • 构造函数
function Star() {};
new Star();


  • 绑定事件函数
// 点击按钮时调用函数
btn.onclick = function() {};


  • 定时器函数
// 每隔 1s 调用一次函数
setInterval(function() {}, 1000);


  • 立即执行函数
(function() {
  console.log('人生的巅峰'); 
})();


二、this

1、函数内 this 的指向

这些 this 的指向,是当我们调用函数的时候确定的。 调用方式的不同决定了this 的指向不同。一般指向我们的调用者

调用方式 this指向
普通函数调用 window
构造函数调用 实例对象,原型对象里面方法中的 this 也指向实例对象
对象的方法调用 该方法所属对象
事件绑定方法 绑定事件的对象
定时器函数 window
立即执行函数 window


改变函数内部 this 指向

JavaScript 为我们专门提供了一些函数方法来帮我们更优雅的处理函数内部 this 的指向问题,常用的有 bind()、 call()、apply() 三种方法。


  • call() 方法

call() 方法调用一个对象。简单理解为调用函数的方式,但是它可以改变函数的 this 指向。


语法:

fun.call(thisArg, arg1, arg2, ...)


参数说明:

thisArg:在 fun 函数运行时指定的 this 值

arg1,arg2:传递的其他参数


注意:

1、返回值就是函数的返回值,因为它就是调用函数

2、因此当我们想改变 this 指向,同时想调用这个函数的时候,可以使用 call,比如继承


 
         

apply() 方法

apply() 方法调用一个函数。简单理解为调用函数的方式,但是它可以改变函数的 this 指向。

语法:

fun.apply(thisArg, [argsArray])


参数说明:

thisArg:在 fun 函数运行时指定的 this 值

argsArray:传递的值,必须包含在数组里面

注意:

  • 1、返回值就是函数的返回值,因为它就是调用函数
    2、因此 apply 主要跟数组有关系,比如使用 Math.max() 求数组的最大值
  • bind() 方法
    bind() 方法不会调用函数。但是能改变函数内部 this 指向
    语法:
fun.bind(thisArg, arg1, arg2, ...)


参数说明:

thisArg:在 fun 函数运行时指定的 this 值

arg1,arg2:传递的其他参数


说明:

1、返回由指定的 this 值和初始化参数改造的原函数拷贝

2、因此当我们只是想改变 this 指向,并且不想调用这个函数的时候,可以使用 bind


2、call apply bind 总结

相同点:都可以改变函数内部的this指向.

区别点:

1、call 和 apply 会调用函数, 并且改变函数内部this指向

2、call 和 apply 传递的参数不一样, call 传递参数 aru1, aru2…形式 apply 必须数组形式[arg]

3、bind 不会调用函数, 可以改变函数内部this指向

主要应用场景:

1、call 经常做继承

2、apply 经常跟数组有关系,比如借助于数学对象实现数组最大值最小值

3、bind 不调用函数,但是还想改变this指向,比如改变定时器内部的this指向


三、严格模式

1、什么是严格模式

JavaScript 除了提供正常模式外,还提供了严格模式(strict mode)。ES5 的严格模式是采用具有限制性 JavaScript 变体的一种方式,即在严格的条件下运行 JS 代码

严格模式在 IE10 以上版本的浏览器中才会被支持,旧版本浏览器中会被忽略

严格模式对正常的 JavaScript 语义做了一些更改:

1、消除了 Javascript 语法的一些不合理、不严谨之处,减少了一些怪异行为

2、消除代码运行的一些不安全之处,保证代码运行的安全

3、提高编译器效率,增加运行速度

4、禁用了在 ECMAScript 的未来版本中可能会定义的一些语法,为未来新版本的 Javascript 做好铺垫。比 如一些保留字如:class, enum, export, extends, import, super 不能做变量名


2、开启严格模式

严格模式可以应用到 整个脚本 或 个别函数 中。因此在使用时,我们可以将严格模式分为 为脚本开启严格模式 和 为函数开启严格模式 两种情况。


  • 为脚本开启严格模式

为整个脚本文件开启严格模式,需要在所有语句之前放一个特定语句 "use strict"; (或'use strict';)。

代码:

<script>
  "use strict";
  console.log("这是严格模式。");
</script>
  • 因为 “use strict” 加了引号,所以老版本的浏览器会把它当作一行普通字符串而忽略。
  • 为脚本开启严格模式


有的 script 基本是严格模式,有的 script 脚本是正常模式,这样不利于文件合并,所以可以将整个脚本文件 放在一个立即执行的匿名函数之中。这样独立创建一个作用域而不影响其他 script 脚本文件。

代码:

(function (){
  "use strict";
  var num = 10;
  function fn() {} 
})();


  • 为函数开启严格模式

要给某个函数开启严格模式,需要把"use strict"; (或 'use strict'; ) 声明放在函数体所有语句之前。

代码:

function fn(){ 
  "use strict";
  return "这是严格模式。"; 
}
  • "use strict" 放在函数体的第一行,则整个函数以 “严格模式” 运行。


3、严格模式中的变化

严格模式对 Javascript 的语法和行为,都做了一些改变。


  • 变量规定
  • 在正常模式中,如果一个变量没有声明就赋值,默认是全局变量。严格模式禁止这种用法,变量都必须先用 var 命令声明,然后再使用。
  • 严禁删除已经声明变量。例如,delete x; 语法是错误的。


严格模式下 this 指向问题

  • 以前在全局作用域函数中的 this 指向 window 对象
  • 严格模式下全局作用域中函数中的 this 是 undefined
  • 以前构造函数时不加 new 也可以调用,当普通函数,this 指向全局对象
  • 严格模式下,如果构造函数不加new调用,this 指向的是 undefined 如果给他赋值则会报错
  • new 实例化的构造函数指向创建的对象实例
  • 定时器 this 还是指向 window
  • 事件、对象还是指向调用者


  • 函数变化
  • 函数不能有重名的参数
  • 函数必须声明在顶层。新版本的 JavaScript 会引入 “块级作用域” ( ES6 中已引入)。为了与新版本接轨,不允许在非函数的代码块内声明函数。


更多严格模式要求参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Strict_mode



目录
相关文章
|
3月前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
66 0
|
4月前
|
JavaScript 前端开发 Java
JavaScript笔记(回顾一,基础知识篇)
JavaScript基础知识点回顾,包括语言定义、ECMAScript规范、字面量、变量声明、操作符、关键字、注释、流程控制语句、数据类型、类型转换和引用数据类型等。
JavaScript笔记(回顾一,基础知识篇)
|
7月前
|
前端开发 JavaScript 安全
高级前端开发需要知道的 25 个 JavaScript 单行代码
1. 不使用临时变量来交换变量的值 2. 对象解构,让数据访问更便捷 3. 浅克隆对象 4. 合并对象 5. 清理数组 6. 将 NodeList 转换为数组 7. 检查数组是否满足指定条件 8. 将文本复制到剪贴板 9. 删除数组重复项 10. 取两个数组的交集 11. 求数组元素的总和 12. 根据指定条件判断,是否给对象的属性赋值 13. 使用变量作为对象的键 14. 离线状态检查器 15. 离开页面弹出确认对话框 16. 对象数组,根据对象的某个key求对应值的总和 17. 将 url 问号后面的查询字符串转为对象 18. 将秒数转换为时间格式的字符串 19.
68 3
高级前端开发需要知道的 25 个 JavaScript 单行代码
|
5月前
|
存储 缓存 自然语言处理
深入理解JS | 青训营笔记
深入理解JS | 青训营笔记
46 0
|
7月前
|
JavaScript vr&ar 数据库
技术笔记:Js获取当前日期时间及其它操作
技术笔记:Js获取当前日期时间及其它操作
151 1
|
7月前
|
Web App开发 JavaScript iOS开发
技术笔记:js数组定义和方法(包含ES5新增数组方法)
技术笔记:js数组定义和方法(包含ES5新增数组方法)
|
7月前
|
JavaScript BI
技术笔记:JS获取子节点、父节点和兄弟节点的方法实例总结
技术笔记:JS获取子节点、父节点和兄弟节点的方法实例总结
115 0
|
7月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp小程序的笔记记录分享网站附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp小程序的笔记记录分享网站附带文章源码部署视频讲解等
42 0
|
2月前
|
JavaScript 前端开发
JavaScript中的原型 保姆级文章一文搞懂
本文详细解析了JavaScript中的原型概念,从构造函数、原型对象、`__proto__`属性、`constructor`属性到原型链,层层递进地解释了JavaScript如何通过原型实现继承机制。适合初学者深入理解JS面向对象编程的核心原理。
36 1
JavaScript中的原型 保姆级文章一文搞懂
|
6月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
119 2
下一篇
开通oss服务