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



目录
相关文章
|
16天前
|
前端开发 JavaScript
JavaScript新科技:PostCSS的安装和使用,2024年最新2024网易Web前端高级面试题总结
JavaScript新科技:PostCSS的安装和使用,2024年最新2024网易Web前端高级面试题总结
|
17天前
|
JavaScript 前端开发
web前端JS高阶面试题(1),高级开发工程师面试
web前端JS高阶面试题(1),高级开发工程师面试
|
19天前
|
JavaScript 前端开发
JavaScript高级主题:什么是 ES6 的解构赋值?
【4月更文挑战第13天】ES6的解构赋值语法简化了从数组和对象中提取值的过程,提高代码可读性。例如,可以从数组`[1, 2, 3]`中分别赋值给`a`, `b`, `c`,或者从对象`{x: 1, y: 2, z: 3}`中提取属性值给同名变量。
19 6
|
19天前
|
存储 JavaScript 前端开发
JavaScript高级主题:JavaScript 中的 Map 和 Set 是什么?它们有什么区别?
JavaScript的ES6引入了Map和Set数据结构。Map用于存储键值对,适合通过键进行查找,而Set则存储唯一值,无键且不支持键查找。两者在性能上表现出色,尤其在频繁的写入删除操作中。选择使用哪个取决于具体应用场景:键值对需求选Map,独特值集合则选Set。
21 2
|
19天前
|
JavaScript 前端开发 Java
JavaScript高级笔记-coderwhy版本(六)
JavaScript高级笔记-coderwhy版本
77 0
|
19天前
|
JavaScript 前端开发 Java
JavaScript高级笔记-coderwhy版本(五)
JavaScript高级笔记-coderwhy版本
103 0
|
19天前
|
JavaScript 前端开发 存储
JavaScript高级笔记-coderwhy版本(四)
JavaScript高级笔记-coderwhy版本
76 0
|
19天前
|
JavaScript 前端开发 Dart
JavaScript高级笔记-coderwhy版本(三)
JavaScript高级笔记-coderwhy版本
64 0
JavaScript高级笔记-coderwhy版本(三)
|
19天前
|
JavaScript 前端开发 Go
JavaScript高级笔记-coderwhy版本(二)
JavaScript高级笔记-coderwhy版本
113 0
JavaScript高级笔记-coderwhy版本(二)
|
19天前
|
JavaScript 前端开发 Java
JavaScript高级笔记-coderwhy版本(一)
JavaScript高级笔记-coderwhy版本
39 0
JavaScript高级笔记-coderwhy版本(一)