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. c++ 的makefile文件实例

    首先声明, 感谢九哥的帮助,因为从来没写过makefile, 所以一直是手动编译, 然后有一次写了三个文件, 需要编译, 而我只编译了一个文件, 所以一直出错, 九哥告诉我用makefile更方便, ...

  2. Mybatis trim标签

      trim代替where/set标签 trim 是更灵活用来去处多余关键字的标签,它可以用来实现 where 和 set 的效果. <!-- 使用 if/trim 代替 where(判断参数) ...

  3. Mybatis表关联多对一

    在上章的 一对多 中,我们已经学习如何在 Mybatis 中关联多表,但在实际项目中也是经常使用 多对一 的情况,这些查询是如何处理的呢,在这一节中我们来学习它.多表映射的多对一关系要用到 mybit ...

  4. Maven外部依赖

    正如大家所了解的那样,Maven确实使用 Maven 库的概念作依赖管理.但是,如果依赖是在远程存储库和中央存储库不提供那会怎么样? Maven 提供为使用外部依赖的概念,就是应用在这样的场景中的. ...

  5. Dynamics CRM 2015/2016 Web API:聚合查询

    各位小伙伴们,今天是博主2016年发的第一篇文章.首先祝大家新年快乐.工资Double,哈哈.今天我们来看一个比較重要的Feature--使用Web API运行FetchXML查询! 对的,各位.你们 ...

  6. Java常用系统变量收集

    public static void main(String[] args) { System.out.println("java版本号:" + System.getPropert ...

  7. 3D HTML5 Logo标志 超炫酷旋转特效

    今天又要为大家带来一款超酷的HTML5 Canvas 3D动画特效,是一款可以旋转的HTML5 Logo标志.画面上一共有两块可旋转的区域,第一是可旋转的背景,第二则是可旋转的Logo标志.Logo标 ...

  8. android中YUV转RGB的方法

    在一个外国网站上看到一段YUV转RGB的程序很不错,根据维基上的知识,方法应该是没问题的,自己也用过了,效果没问题. 首先说一下android上preview中每一帧的信息都是YUV420的,或者叫N ...

  9. 大内核锁 BKL

    参考:http://blog.csdn.net/universus/article/details/5623971                                            ...

  10. 详解ABBYY FineReader 12内置的自动化任务

    要使用ABBYY FineReader处理文档,需要完成四个步骤:获取文档图像>识别该文档>验证结果>以选取的格式保存结果.如果需要再三地重复相同的步骤,您可以使用ABBYY Fin ...