作用域和作用域链

执行上下文环境

一、全局

1.变量

console.log(a);//a is not defined

var a;//undefined

var a=10;//undefined

2.this

 var a;
console.log(this);

3.函数声明

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

说明:

1.变量:变量的声明,默认赋值为undefined
2.this:赋值
3.函数声明:赋值

二、函数中的变量

 1.函数每被调用一次,都会产生一个新的执行上下文(函数上下文),不同的调用会有不同的参数

 // 自由变量:全局变量在定义、创建时就指明了它的作用域。定义与使用的不同

var a=10;//全局变量
function f(){
    console.log(a);//a是自由变量,
}                   //函数创建时,就确定了它要取值作用域

function f1(){
    var a=34;//局部
    f();
}
 f1();//输出10,而不是34

//函数中的变量
// 函数每被调用一次,都会产生一个新的执行上下文,因为不同的调用可能会有不同的参数
function fr(x){
    console.log(arguments);//[10]
    console.log(x);//10
}
fr(10);

var b=10;//全局

function test2(){

    b=100;//全局变量
    alert(b);//100
    alert(this.b);//100

    alert(b);//100
}

test2();
alert(b);//100

说明:

全局的上下文环境数据内容
     普通变量   声明默认取值undefined
     函数声明     赋值
     this        赋值

局部上下文环境数据内容
     参数                   赋值
     arguments             赋值
     自由变量的取值作业域     赋值

执行上下文栈

执行全局代码时,会产生一个全局上下文环境,每次调用函数是会产生一个函数上下文环境。当函数调用完成时,这个函数的上下文以及全局的上下文会被销毁,再重新回到全局上下文环境,处于活动状态的执行上下文环境只有一个。(压栈 出栈)

      var a=10;//1.进入全局上下文环境
    var fn=function(y){
        var c=5;
        console.log(y+c);
    };
    var bar=function(x){
        var b=5;
       fn(x+b);//进入fn函数上下文环境
    };

    bar(10);//进入bar函数上下文环境

作用域

其中没有变量,要通过作用域对应得执行上下文环境来获取变量的值。在同一作用域下,不同的调用会产生不同的执行上下文环境,从而产生不同变量的值。

   var b=10;//全局
function test2(){

    b=100;//全局变量
    alert(b);//100
    alert(this.b);//100

    alert(b);//100
}

test2();
alert(b);//100

作用域和执行上下文

除了全局作用域之外,每个函数都会创建自己自得作用域。作用域是在函数定义时就已经确定,而不是在函数调用时确定。

var a=10,b=20;
function fn(x){
    var a=100,c=200;
    function fn1(){
        var a=1000,d=4000;
    }
    fn1(200);
    fn1(300);
}
fn(10);

自由变量

x作用域中使用的变量a,却没有在该作用域中声明(即在其他作用域中声明的)对于x作用域来说,a就是自由变量。

var a=10;//全局变量
function f(){
    console.log(a);//a是自由变量,

}                   //函数创建时,就确定了它要取值作用域

作用域链

1.先在当前作用域查找变量a,如果有就获取并结束,否则继续。
2.如果当前作用域是全局作用域,则证明变量x未定义,结束,否则继续。
3.如果是函数作用域(function)就将创建该函数的作用域作为当前作用域。
4.按第一步依次执行

时间: 2024-10-10 01:18:17

作用域和作用域链的相关文章

作用域、作用域链、闭包

作用域.作用域链 一.Js以前没有块级作用域,不过在ES6中有let了. 二.Js使用函数作用域 function aaa(){ var a = "a"; } console.log(a);//报错 三.声明提前 console.log(aaa)//报错 console.log(aaa);//undefined 声明未定义 var aaa; console.log(aaa); //undefined 声明未定义 var aaa = "aaa"; 四.Js的作用域链

JavaScript 开发进阶:理解 JavaScript 作用域和作用域链

作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理.今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望能帮助大家更好的学习JavaScript. JavaScript作用域 任何程序设计语言都有作用域的概念,简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期.在JavaScript中,变量的作用域有全局作用域和局部作用域两种. 1.  全局作用域(Global S

JavaScript作用域和作用域链

JavaScript 开发进阶:理解 JavaScript 作用域和作用域链 来源:梦想天空  http://www.cnblogs.com/lhb25/archive/2011/09/06/javascript-scope-chain.html 作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理.今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望能帮助大家更好的学习JavaScript. Java

关于Javascript作用域及作用域链的总结

本文是根据以下文章以及<Javascript高级程序设计(第三版)>第四章相关内容总结的. 1.Javascript作用域原理,地址:http://www.laruence.com/2009/05/28/863.html 2.JavaScript 开发进阶:理解 JavaScript 作用域和作用域链,地址:http://www.cnblogs.com/lhb25/archive/2011/09/06/javascript-scope-chain.html 在介绍有关作用域的内容之前,先来介绍

javascript学习中自己对作用域和作用域链理解

在javascript学习中作用域和作用域链还是相对难理解些,下面我关于javascript作用域和作用域链做一下详细介绍,给各位初学者答疑解惑. 首先我们介绍一下什么是作用域?  从字面上理解就是起作用的区域.   作用域主要有两种作用域:      1.块级作用域(js 不支持):主要用于C系列语言中,例如:Java Object-c/Swift(苹果开发语言).C++/C#.在此不做过多说明.      2.词法作用域  一个变量的作用范围,在代码写出来的那一刻就定下来了,不会根据代码的运

闭包、作用域、作用域链

一 作用域,作用域链 先上代码 1 var scope="global"; 2 function t(){ 3 console.log(scope); 4 var scope="local" 5 console.log(scope); 6 } 7 t(); 此时打印出来的 按顺序分别是undefine,local,为什么第一个是undefined呢,摘抄下js作用域原话: Javascript没有块级作用域,而是函数作用域. 所谓函数作用域就是说:->变量在声

JavaScript之作用域与作用域链

今天是2016的第一天,我们得扬帆起航踏上新的征程了.此篇阐述JavaScript中很重要的几个概念:作用域与作用域链及相关知识点. 我们先从变量与作用域的行为关系开始讨论. 变量作用域 JavaScript中,变量有全局变量及局部变量之分,而能定义变量作用域的语块只有函数.与局部变量有关的一种有趣特性,在此处不得不谈--变量提升. 变量提升 变量提升为何物? JavaScript的变量声明会被提升到它们所在函数的顶部,而初始化仍旧在原来的地方.JavaScript引擎并没有重写代码:每次调用函

作用域、原型链、闭包等概念理解

1.执行环境及作用域 (1).执行环境: 定义了变量或函数有权访问的其它数据,决定了它们的各自行为.每个执行环境都有一个与之关联的变量对象(variable object, VO),执行环境中定义的所有变量和函数都会保存在这个对象中,解析器在处理数据的时候就会访问这个内部对象. 全局执行环境是最外层的一个执行环境,在web浏览器中全局执行环境是window对象,因此所有全局变量和函数都是作为window对象的属性和方法创建的.每个函数都有自己的执行环境,当执行流进入一个函数的时候,函数的环境会被

JavaScript作用域及作用域链详解、声明提升

相信大家在入门JavaScript这门语言时对作用域.作用域链.变量声明提升这些概念肯定会稀里糊涂,下面就来说说这几个 Javascript 作用域 在 Javascript 中,只有局部作用域和全局作用域.而只有函数可以创建局部作用域,像 if,for 或者 while 这种块语句是没办法创建作用域的. (当然 ES6 提供了 let 关键字可以创建块作用域.) Javascript 的这种特性导致 for 循环里面创建闭包时会产生让人意想不到的结果.比如下面这个例子: var i = 20;

作用域和作用域链 —javascript面向对象高级

# 作用域和作用域链 # ## 1.作用域 ## 定义:函数声明时,会确定当前函数的作用域,所谓作用域就是作用的范围(地盘) 全局作用域: a. window是顶层对象,是一切函数,变量,对象的终点, b. 所以在全局范围内定义的函数或变量,它都是属于window对象的属性或方法. c. 其作用域范围是全局,任何地方均能调用. 局部作用域: a. 函数声明时,函数内部的作用域就是局部作用域, b. 在函数内部通过var 声明的变量 和 声明式的函数均是该函数的私有变量或函数, c. 一般情况下,