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. Sanjeev Arora

    中文名:桑吉弗 阿罗拉 个人主页:https://www.cs.princeton.edu/~arora/ 生日:1968年一月 祖籍:印度 本科:1990年麻省理工大学毕业 博士:1994年加州伯克 ...

  2. [转]Idea2016 使用Maven配置简单Web项目(受益比较多的一篇)

    最近被同事一直吵着用Idea写Java,于是偷偷的去试用了一下Idea.确实不错,无论界面还是智能提醒都是蛮符合我的使用习惯,但是刚从Eclipse出来,使用Idea还是不太习惯的.所以这里写出来,供 ...

  3. nodejs基础 -- web模块

    什么是 Web 服务器? Web服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,Web服务器的基本功能就是提供Web信息浏览服务.它只需支持HTTP协议.HTML文档格式及URL,与客 ...

  4. R语言igraph 包-构建网络图

    igaph 是一个项目,目标是建立一条简单,易用的网络分析工具,有 R, python, C/C++ 等语言的具体实现: 项目主页: http://igraph.org/ 在R语言中,对应的就是 ig ...

  5. MySql折腾小记二:text/blog类型不允许设置默认值,不允许存在两个CURRENT_TIMESTAMP

    From: http://www.cnblogs.com/cyq1162/archive/2011/05/17/2049055.html 在 CYQ.Data 数据框架的反向工程中,遇到MySQL的问 ...

  6. MySQL存储引擎Innodb和MyISAM对比总结

    Innodb引擎 InnoDB是一个事务型的存储引擎,设计目标是处理大数量数据时提供高性能的服务,它在运行时会在内存中建立缓冲池,用于缓冲数据和索引. Innodb引擎优点 1.支持事务处理.ACID ...

  7. categorys源码

    CREATE TABLE `category` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `editdate` char(20) NOT NUL ...

  8. svn管理码云项目

    1.设置SVN管理项目 进入项目->管理 2.获取SVN地址 3.SVN添加项目.单击右键 -> 检出->版本库Url(这里填写svn地址)

  9. 【python】并行化的又一种思路

    https://segmentfault.com/a/1190000000414339

  10. 8 map的用法

    what's map go里面的map和python字典差不多. 类似其他语言中的哈希表或者字典,以key-value的形式存储的数据 key必须是支持==或者!=比较运算的类型,不可以是函数.map ...