Javascript笔记:作用域和执行上下文
一、作用域
Javascript的作用域规则是在编译阶段确定的,有声明时的位置决定。
JS中有全局作用域,函数作用域,块级作用域(ES6引入)。
1. 全局作用域
在整个程序生命周期内都是有效的,在任意的函数内部都能访问的变量或函数拥有全局作用域。以下几种情形拥有全局作用域:
1. 定义在最外层的变量和函数,拥有全局作用域。
2. 未声明直接复制的变量,拥有全局作用域。
3.在浏览器环境中,定义在window对象上的属性,具有全局作用域。
2. 函数作用域
在某个函数内部声明的变量或函数拥有函数作用域。它们只能被该函数的语句使用,函数外部是不可访问的。函数在创建的时候,变量和函数的函数作用域已经确定下来。函数的参数也属于函数内部的变量,因此拥有函数作用域。
3. 块级作用域
ES6新增了块级作用域,通过const和let关键字定义块级作用域。
1、let声明的变量拥有块级作用域,var声明的变量没有块级作用域。
2、var命令会发生"变量提升"现象,即无论var声明的变量处于作用域的第几行,都会提升到作用域的头部,并初始化为undefined。而let命令声明的变量一定要在声明后使用,否则报错。
3、只要块级作用域内存在let命令,它所声明的变量就"绑定"这个区域,凡是在声明之前就使用这些变量,就会报错。
4、let不允许在相同作用域内,重复声明同一个变量。
4. 作用域链
当一个块或函数嵌套在另一个块或函数中时,就发生了作用域的嵌套。因此,在当前作用域中无法搜索到某个变量时,引擎就会在外层嵌套的作用域中继续搜索,直到搜索到该变量,或抵达最外层的作用域(也就是全局作用域)为止。这样一条有序的列表,称为作用域链,作用域链的最前端一定是当前作用域。
二、执行上下文
执行上下文是在函数执行时确定的,每次函数执行都会产生执行上下文,JavaScript引擎会以栈的方式来处理它们,这个栈,我们称其为函数调用栈(call stack)。栈底永远都是全局上下文,而栈顶就是当前处于活动状态的正在执行的上下文,也称为活动对象。
三、this的理解
1. 什么是this?
Javascript中this通常指向函数的拥有者,我们把这个拥有者称为执行上下文。所以this既不指向函数本身,也不指向函数的词法作用域,它是由函数执行时确定的,谁调用就指向谁。
2. this的绑定规则。
this的绑定规则有四个:默认绑定,隐式绑定,显示绑定,new绑定。优先级从低到高。
默认绑定:在没有其它规则的默认规则。
funcOne()是直接执行的,默认将全局对象绑定到this上。

注意:严格模式下,全局对象将无法使用默认绑定,执行会提示undefined错误。

隐式绑定:除了直接对函数调用外,有时候函数调用是在某个对象上触发的(面向对象经常会使用这种语法),即调用位置上存在上下文对象。

这里func属性指向函数funcOne的地址,this进行了隐式绑定,绑定到了obj上。
注意:以下两种情况,隐式绑定会丢失。
A. 函数别名
下面的例子会输出'global',是因为obj.func是引用属性,复制给func,实际上就是func指向funcOne函数。整个过程没用obj的参与,所以默认绑定到全局属性上。

B. 回调函数
因为参数传递同样是引用关系,所以传参实际上传递的是funcOne函数本身的引用。

显示绑定:显示绑定通过改变对象的prototype关联对象,可以通过call()或者apply()实现。

new绑定:this指向new出来的对象。
Javascript笔记:作用域和执行上下文的更多相关文章
- JS基础篇之作用域、执行上下文、this、闭包
前言:JS 的作用域.执行上下文.this.闭包是老生常谈的话题,也是新手比较懵懂的知识点.当然即便你作为老手,也未必真的能理解透彻这些概念. 一.作用域和执行上下文 作用域: js中的作用域是词法作 ...
- JavaScript学习系列之执行上下文与变量对象篇
一个热爱技术的菜鸟...用点滴的积累铸就明日的达人 正文 在上一篇文章中讲解了JavaScript内存模型,其中有提到执行上下文与变量对象的概念.对于JavaScript开发者来说,理解执行上下文与变 ...
- JS高阶---作用域与执行上下文
一句话介绍 .
- JavaScript执行上下文
变量声明.函数声明为何会提升?js执行时是如何查找变量的?JavaScript中最基本的部分——执行上下文(execution context) 什么是执行上下文? 当JavaScript代码运行,执 ...
- 了解JavaScript的执行上下文
转自http://www.cnblogs.com/yanhaijing/p/3685310.html 什么是执行上下文? 当JavaScript代码运行,执行环境非常重要,有下面几种不同的情况: 全局 ...
- 前端知识体系:JavaScript基础-原型和原型链-理解JavaScript的执行上下文栈,可以应用堆栈信息快速定位问题
理解JavaScript的执行上下文栈,可以应用堆栈信息快速定位问题(原文文档) 1.什么是执行上下文: 简而言之,执行上下文就是当前JavaScript代码被解析和执行时所在环境的抽象概念,Java ...
- [JavaScript深入系列]JavaScript深入之执行上下文栈(转载)
顺序执行? 如果要问到 JavaScript 代码执行顺序的话,想必写过 JavaScript 的开发者都会有个直观的印象,那就是顺序执行,毕竟: var foo = function () { co ...
- Javascript本质第二篇:执行上下文
在上一篇文章<Javascript本质第一篇:核心概念>中,对Javascript执行上下文做了解释,但是这些都是基于Javascript标准中对执行上下文的定义,也就是说理论上的东西,本 ...
- JavaScript深入之执行上下文栈
如果要问到 javascript 代码执行顺序的话,想必写过javascript的开发者都会有个直观的印象,那就是顺序执行,例如: var foo = function(){ console.log( ...
随机推荐
- K8S集群集成harbor(1.9.3)服务并配置HTTPS
一.简介 简介请参考:https://www.cnblogs.com/panwenbin-logs/p/10218099.html 二.安装Harbor主机环境及安装要求 主机环境: OS: Cent ...
- SAP PI开发手册-ERP发布服务供外部系统调用(sproxy代理类)
转自:https://www.cnblogs.com/fanjb/p/10829858.html 一. 接口内容 接口详细信息 1. 字段对应关系 发送字段对应关系 返回字段对应关系 2. ...
- 三维网格细分算法(Catmull-Clark subdivision & Loop subdivision)附源码(转载)
转载: https://www.cnblogs.com/shushen/p/5251070.html 下图描述了细分的基本思想,每次细分都是在每条边上插入一个新的顶点,可以看到随着细分次数的增加,折 ...
- C# 三元表达式
一.背景 因编程的基础差,因此最近开始巩固学习C#基础,后期把自己学习的东西,总结相应文章中,有不足处请大家多多指教. 二.语法 表达式1?表达式2:表达式3 描述: 表达式1一般为一个关系表达式. ...
- HttpListener 实现小型web服务器
HttpListener 实现web服务器 用于小型服务器,简单.方便.不需要部署. 总共代码量不超过50行. static void Main(string[] args) { //创建HTTP监听 ...
- MVC三层架构搭建
MVC三层架构搭建 项目主要是用三层来搭建项目,三层分为表现层,数据层和业务层.项目用了目前比较流行的IOC架构.目前流行的IoC 框架有AutoFac,Unity,Spring.NET等,项目中选用 ...
- go 1.11 模块和版本管理
自2007年“三巨头(Robert Griesemer, Rob Pike, Ken Thompson)”提出设计和实现Go语言以来,Go语言已经发展和演化了十余年了.这十余年来,Go取得了巨大的成就 ...
- Java问题记录——OutOfMemoryError
Java问题记录——OutOfMemoryError 摘要:本文主要分析了OutOfMemoryError的产生原因. 没有分页导致占用大量内存 查看进程 使用 jps 命令查看当前运行的Java进程 ...
- [b0014] HDFS 常用JAVA 操作实战
目的: 学习用java进行的常用hdfs操作 参考: [b0002] Hadoop HDFS cmd常用命令练手 环境: hadoop2.6.4 win7 下的eclipse环境调试已经配置好,参考前 ...
- 3.UML中的类图及类图之间的关系
统一建模语言简介 统一建模语言(Unified Modeling Language,UML)是用来设计软件蓝图的可视化建模语言,1997 年被国际对象管理组织(OMG)采纳为面向对象的建模语言的国际标 ...