JavaScript函数作用域

  1. JavaScript作用域

作用域:

作用域指一个变量的作用范围

JS中一共两种作用域:

(1)全局作用域

(2)函数作用域(局部作用域)

1、全局作用域

直接写在script标签的JS代码,都在全局作用域

全局作用域在页面打卡的时候创建,在页面关闭时销毁

在全局作用域中有一个对象window,他代表一个浏览器的窗口,它由浏览器创建,我们可以直接使用

在全局作用域中:

创建的变量都会作为window对象的属性保存

全局中的函数都会作为window对象的方法保存

全局作用域中的变量都是全局变量

在页面的任意的部分都可以访问到

【拓展部分】

变量的声明提前

使用var关键字声明的变量,会在所有的代码执行之前被声明(但是不会赋值)但是如果声明变量时不使用var关键字,则变量不会被声明提前函数声明提前

使用函数声明形式创建的函数function(){}

他会在所有的代码执行之前就被创建,所有我们在可以函数声明前来调用函数

使用函数表达式创建的函数不会被声明提前

在函数作用域中也有声明提前的特征

函数声明也会在函数中所有的代码执行前声明

2、函数作用域

调用函数时创建函数作用域,函数执行完毕以后,作用域销毁

每调用一次函数就会创建一个新的函数作用域,它们之间是相互独立的

在函数作用域中可以访问全局变量,但在全局作用域中无法访问到局部变量

当在函数作用域操作一个变量时,它会先在自身作用域中寻找,如果有就直接使用,如果没有就向上一作用域中寻找,直到找到全局作用域,如果全局作用域中仍然没有找到,则会报错ReferenceError

在函数中想要访问全局变量可以使用window对象

  1. JavaScript中this

解析器在调用函数每次都会向函数内部传递一个隐含的参数

这个隐含的参数就是this,this指向的是一个对象

这个对象我们称为函数执行的上下文对象

根据函数调用方式不同,this会指向不同的对象

总结this:

  1. 以函数的形式调用时,this永远都是window
  2. 以方法的形式调用是,this就是调用方法的那个对象
  1. JavaScript构造函数

创建一个构造函数,专门用来创建Person对象

构造函数就是一个普通的函数,创建方式和普通函数没有区别,不同的是构造函数习惯上首字母大写

构造函数和普通函数的区别就是调用方式的不同

普通函数是直接调用,而构造函数需要使用new关键字来调用

构造函数的执行流程:

  1. 立刻创建一个新的对象
  2. 将新建的对象设置给函数中的this,在构造函数中可使用this来引用新建的对象
  3. 逐行执行函数中的代码
  4. 将新建的对象作为返回值返回

使用同一个构造函数创建的对象,我们称为一类对象,也将一个构造函数称为一个类

我们将通过一个构造函数创建的对象,称为该类的实例

对this的情况进行总结:

  1. 当以函数的形式调用时,this就是window对象
  2. 当以方法的形式调用时,this及时调用方法的这个对象
  3. 当以构造函数的形式调用时,this就是新创建额对象

在创建Person构造函数中,为每个对象都添加了一个sayhllo方法

目前我们的方法都是在构造方法内部创建的,也就是构造函数每执行一次就会创建一个新的sayhello方法,也就是说所有实例的sayhello都是唯一的。

这样就导致了构造函数执行一次就会创建一个新的方法

执行多少次就会创建多少个新的方法,而这些方法都是一摸一样的,这样就导致了内存空间的浪费,其实我们可以让所有对象共享同一个方法

  1. JavaScript原型prototype

我们创建的每一个函数,解析器都会向函数中添加一个属性prototye这个属性对应着一个对象,这个对象就是我们所谓的原型对象

如果函数作为普通函数调用protoype没有任何作用

当函数以构造函数的形式调用时,他所创建的对象中都有会一个隐藏的属性指向该构造函数的原型对象,我们可以通过__proto__来访问该属性

原型对象就相当于一个公共的区域,所有同一个类的实例都可以访问到这个原型对象,我们可以将对象中共有的内用,统一设置到 原型对象中

当我们访问对象的一个属性或方法时,它会先在对象自身中寻找,如果有则直接使用,如果没有则会去原型对象中寻找。如果找到则直接使用

以后我们创建工作函数时,可以将这些对象共有的属性和方法,统一添加到工作函数的原型对象中,这样不用分别为每个对象添加,也不会影响到全局作用域,就可以使每个对象都具有这些属性和方法了。

  1. JavaScript垃圾回收(GC)

垃圾回收(GC)就像人生活的时间长了会产生垃圾一样,程序运行过程中也会产生垃圾,这些垃圾积攒过多以后,就会导致程序运行的速度过慢,所有我们需要一个垃圾回收机制,来处理程序运行过程产生垃圾。

当一个对象没有任何的变量或则属性对他进行引用,此时我们将永远无法操作该对象,此时这种对象就是一个垃圾,这种对象过多会占用大量的内存空间,导致程序运行变慢,所以这种垃圾必须清理。

在JS中拥有自动的垃圾回收机制,会自动将这些垃圾对象在内存中销毁,我们不需要也不能进行垃圾回收的操作。

我们需要做的只是将不再使用的对象设置为unll即可。

JavaScript函数作用域相关推荐

  1. 浅谈JavaScript 函数作用域当中的“提升”现象

    在JavaScript当中,定义变量通过var操作符+变量名.但是不加 var 操作符,直接赋值也是可以的. 例如 : message = "hello JavaScript ! " ...

  2. javascript函数作用域与闭包

    8.8. 函数作用域与闭包        如第四章所述,JavaScript函数的函数体在局部作用域中执行,局部作用域不同于全局作用域.本章将解释这些内容和相关的作用域问题,包括闭包.[*] [*] ...

  3. [JavaScript] 函数作用域问题

    理解以下代码: function foo() {let n = 1return function bar() {let m = 1function show() {console.log('m:', ...

  4. JavaScript 函数声明,函数表达式,匿名函数,立即执行函数之区别

    函数声明:function fnName () {-};使用function关键字声明一个函数,再指定一个函数名,叫函数声明. 函数表达式 var fnName = function () {-};使 ...

  5. JavaScript从作用域到闭包

    目录 作用域 全局作用域和局部作用域 块作用域与函数作用域 作用域中的声明提前 作用域链 函数声明与赋值 声明式函数.赋值式函数与匿名函数 代码块 自执行函数 闭包  作用域(scope) 全局作用域 ...

  6. javascript中函数作用域和声明提前

    javascript不像java等其他强类型语句,没有块级作用域(括号内的代码都有自己的作用域,变量在声明它们的代码段之外不可见)一说,但有自己的独特地方,即函数作用域. 函数作用域:变量在声明它们的 ...

  7. 七、深入JavaScript函数,对象和作用域(三)

    @Author:Runsen @Date:2020/5/26 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件.导致翘课严重,专业排 ...

  8. JavaScript基础08-day10【函数的返回值、实参、立即执行函数、方法、全局作用域、函数作用域、提前声明、this、工厂方法创建对象、构造函数】

    学习地址: 谷粒学院--尚硅谷 哔哩哔哩网站--尚硅谷最新版JavaScript基础全套教程完整版(140集实战教学,JS从入门到精通) JavaScript基础.高级学习笔记汇总表[尚硅谷最新版Ja ...

  9. JavaScript 函数(作用域以及闭包)

    JavaScript 函数(作用域以及闭包) ・执行环境及作用域 执行环境定义了变量或函数有权访问的其他数据. 每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量或函数都保存在这个对象中, ...

最新文章

  1. 虚拟存储:迈向私有云的关键一步
  2. 数学建模matlab imread,《matlab数学建模方法与实践》第三章 数据的处理
  3. Java多线程闲聊(二):活锁和死锁
  4. Spring RSocket:基于服务注册发现的 RSocket 负载均衡
  5. lnp和mysql分开安装_毕业设计之LNP+DISCUZ +分离的数据库操作
  6. java 串口tcp客户端访问串口tcp服务器_怎么使用无线串口服务器
  7. 运维小白的成长日记第四天-基础网络构建OSI七层模型-物理层基础知识
  8. 如何在装有 macOS Monterey 的 Mac 上使用省电模式?
  9. python arduino 蓝牙_树莓和Arduino之间的蓝牙通讯
  10. 学不会PDF裁剪与PDF拆分?6个方法包你轻松学会
  11. 由可乐加比萨化学反应引发的联想
  12. nanopi 2 fire s5p4418 初次体验 (1)uboot,linux kernel编译
  13. Go语言实战之数组的内部实现和基础功能
  14. 神经网络传递函数的选择,卷积神经网络风格迁移
  15. ubuntu中rar与unrar用法详解
  16. win7 32位装mysql_2017-11-16 Win7 32位下安装Mysql
  17. 树莓派通过snowboy唤醒引擎(Python2、Python3的都可以),自定义唤醒词、关键字,达到小爱同学、天猫精灵一样的唤醒方式的全套教程
  18. 既约分数(python)
  19. 手把手教你打造一个排队叫号系统
  20. 西子奥的斯服务器显示dlf,西子奥的斯电梯驱动器故障代码

热门文章

  1. 事务未提交导致记录被锁的解决方法
  2. 数据库两个表有一个字段互相关联,根据这个关联字段更新一张表
  3. C提高_day03_作业第三题
  4. 通过JMX获取weblogic的监控指标
  5. Windows下 Apache配置虚拟主机
  6. 《白帽子讲web安全》学习笔记 (3)
  7. 文本识别新王者CharNet:卷积字符网络
  8. 仅用10个月!中国高中生拿下Kaggle Master,怎么做到的?
  9. Python中的from import和import的区别?没有比这回答的更好了
  10. 学Python可以用来干什么?就业情况究竟怎么样?