1.js中的执行上下文或者执行环境:execution context,简称EC;

2.

 console.log(a);//undefined
var a=200;
fn('lili');
function fn(name){
age=23;
console.log(name,age);//lili 23
var age;
}

分析这段代码的执行过程:首先需要记得,

在js中,存在变量提升。函数声明和变量声明总是会被解释器悄悄地被“提升”到方法体的最顶端,因此一般在写代码的时候,通常我们在每个作用域开始前声明这些变量,这也是正常的 JavaScript 解析步骤,易于我们理解。

因此这段代码,就可以这样变形:

//函数提升优先于变量提升
function fn(name){
var age;
age=23;
console.log(name,age);//lili 23
} var a; console.log(a);//只声明变量a,但是并未赋值,因此为undefined var a=200; fn('lili');//函数在执行的过程中,传入参数name='lili',进入fn的执行域中,var age提前;并赋值为23

*增加:函数覆盖

 var a;
function a(){}
console.log(a);//function a(){}

1)函数声明和变量声明均会被提升,但是函数声明会覆盖变量声明,就像上面的代码。

2)但是,如果变量已被赋值,则最终的值为变量的值:

 var a=1;
function a(){}
console.log(a);//

3)变量重复声明是无用的,但是函数的重复声明会覆盖前面的声明;

//变量的重复声明
var a = 1;
var a;
console.log(a);// //函数声明优于变量声明,故变量声明无作用
var a;
function a(){
console.log(1);//
}
a(); //后面的函数声明会覆盖前面的函数声明
a();//
function a(){
console.log(1);
}
function a(){
console.log(44);
}

因此写代码的时候,应该避免在同一作用域内重复声明


3.再了解一下执行上下文的其他:

  • 范围:一段<script>或者一个函数;
  • 全局:变量定义、函数声明;
  • 函数:变量定义、函数声明、this、arguments

定义函数有两种方式:函数声明以及函数表达式(函数声明的一个重要特征:函数声明提升)

小tip:区分函数声明以及函数表达式

 //函数声明
function fn(){
...
} //函数表达式
var fn = function(){
...
}

1.this:要在执行时才能确定值,定义时无法确定。

 var a={
name:'A',
fn:function(){
console.log(this.name);//undefined
}
}; a.fn();//A this===a
a.fn.call({name:'B'});//B this==={name:'B'} var fn1=a.fn;
fn1();//this===window

2.this的几种使用情况:

*作为构造函数执行

 function Foo(){
this.name='shangsan';
}
var f = new Foo();
f.name //"shangsan"

*作为对象属性执行

 var obj={
name:'A',
printName:function(){
console.log ( this === obj ); // true
console.log(this.name); //A
}
}
obj.printName();

*作为普通函数执行

 function fn(){
console.log(this);//this===window
}
fn();

*call apply bind

一般来说,this总是指向调用某个方法的对象,但是使用call()和apply()、bind()方法时,就会改变this的指向。

 function fn(name,age){
console.log(name);//lisi
console.log(this);//{x: 100}
}
fn.call({x:100},'lisi',30);

执行上下文、this的更多相关文章

  1. javascript 执行上下文的理解

    首先,为什么某些函数以及变量在没有被声明以前就可以被使用,javascript引擎内部在执行代码以前到底做了些什么?这里,想信大家都会想到,变量声明提前这个概念: 但是,以下我要讲的是,声明提前的这个 ...

  2. Javascript本质第二篇:执行上下文

    在上一篇文章<Javascript本质第一篇:核心概念>中,对Javascript执行上下文做了解释,但是这些都是基于Javascript标准中对执行上下文的定义,也就是说理论上的东西,本 ...

  3. 深入理解javascript原型和闭包(8)——简述【执行上下文】上

    什么是“执行上下文”(也叫做“执行上下文环境”)?暂且不下定义,先看一段代码: 第一句报错,a未定义,很正常.第二句.第三句输出都是undefined,说明浏览器在执行console.log(a)时, ...

  4. 深入理解javascript原型和闭包(9)——简述【执行上下文】下

    继续上一篇文章(http://www.cnblogs.com/wangfupeng1988/p/3986420.html)的内容. 上一篇我们讲到在全局环境下的代码段中,执行上下文环境中有如何数据: ...

  5. 深入理解javascript原型和闭包(11)——执行上下文栈

    继续上文的内容. 执行全局代码时,会产生一个执行上下文环境,每次调用函数都又会产生执行上下文环境.当函数调用完成时,这个上下文环境以及其中的数据都会被消除,再重新回到全局上下文环境.处于活动状态的执行 ...

  6. 理解Javascript之执行上下文(Execution Context)

    1>什么是执行上下文 Javascript中代码的运行环境分为以下三种: 全局级别的代码 - 这个是默认的代码运行环境,一旦代码被载入,引擎最先进入的就是这个环境. 函数级别的代码 - 当执行一 ...

  7. SQL Server安全(6/11):执行上下文与代码签名(Execution Context and Code Signing)

    在保密你的服务器和数据,防备当前复杂的攻击,SQL Server有你需要的一切.但在你能有效使用这些安全功能前,你需要理解你面对的威胁和一些基本的安全概念.这篇文章提供了基础,因此你可以对SQL Se ...

  8. 深入理解js——执行上下文

    什么是"执行上下文"?暂且不下定义,先看一段代码: 第一句报错,a未定义,很正常.第二句.第三句输出都是undefined,说明浏览器在执行console.log(a)时,已经知道 ...

  9. 进阶学习js中的执行上下文

    在js中的执行上下文,菜鸟入门基础 这篇文章中我们简单的讲解了js中的上下文,今天我们就更进一步的讲解js中的执行上下文. 1.当遇到变量名和函数名相同的问题. var a = 10; functio ...

  10. JavaScript的执行上下文

    在JavaScript的运行过程中,经常会遇到一些"奇怪"的行为,不理解为什么JavaScript会这么工作. 这时候可能就需要了解一下JavaScript执行过程中的相关内容了. ...

随机推荐

  1. 摄像头驱动OV7725学习笔记连载(二):0V7725 SCCB时序的实现之寄存器配置

    上一篇博客主要介绍了OV7725的电气特性以及SCCB接口的时序和输出一帧图像的时序图以及数据的拼接.输出一帧图像与输出时钟PCLK有关. 上图是OV7725实现的整体框架,有点丑.FPGA描述SCC ...

  2. 【转】Android开发,按手机上的back键时程序最小化而不退出

    @Override public boolean dispatchKeyEvent(KeyEvent event) { // menuUtils.createTwoDispatcher(event); ...

  3. 通过C#脚本实现旋转的立方体

    一.介绍 目的:通过一个简单的例子(鼠标点击,使立方体旋转和变色)熟悉Unity中C#脚本的编写. 软件环境:Unity 2017.3.0f3 . VS2013. 二.C#脚本实现 1,启动Unity ...

  4. VS下关于 _CRT_SECURE_NO_WARNINGS 问题的分析与解决

    一.问题的起因 六月下旬,老师布置了有关图形学的课设,于是我将我在VS2013中写好的代码进行编译,结果得到了以下信息: 二.解决方法 1,按照英文提示,我先将fopen改成了fopen_s后,发现错 ...

  5. 第三百九十一节,Django+Xadmin打造上线标准的在线教育平台—404,403,500页面配置

    第三百九十一节,Django+Xadmin打造上线标准的在线教育平台—404,403,500页面配置 路由映射在全局也就是根目录里的urls.py里配置404路由映射 注意:不是写在urlpatter ...

  6. struts2系列(二):struts2参数传递错误、struts2的输入错误验证

    一.struts2参数传递错误 1. 基本数据类型的传递最好使用包装类,原因是struts 2.1之后使用基本数据类型如果参数为空会报错2. 日期参数的传递最好定义一个区域的属性(定义locale), ...

  7. 核心动画——Core Animation

    一. CALayer (一). CALayer简单介绍 在iOS中,你能看得见摸得着的东西基本上都是UIView,比方一个button.一个文本标签.一个文本输入框.一个图标等等.这些都是UIView ...

  8. org.in2bits.MyXls.XlsDocument 生成excel文件 ; 如果想读取模板再另外生成的话,试试 NPOI

    优点:不依赖Microsoft组件,在内存中操作excel,读写速度快.   缺点:无法读取模板,只能生成新的excel (我亲自测试是在读取完模板后,不能保存,也不能另存,并且其他人说这个读取还会有 ...

  9. Spring中初始化bean和销毁bean的时候执行某个方法的详解

    关于在spring  容器初始化 bean 和销毁前所做的操作定义方式有三种: 第一种:通过注解@PostConstruct  和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作 ...

  10. springMVC工程使用jreloader实现热部署

    springMVC工程使用jreloader实现热部署applicationContext - ContextLoaderListener重新加载DispatcherServlet 重新加载提高开发效 ...