js作用域链以及全局变量和局部变量

> [带var]

> 在当前作用于中声明了一个变量,如果当前是全局作用域,也相当于给全局作用域设置了一个属性叫做a

```javascript

//=>变量提升:var a; <=>window.a=undefined;

console.log(a);//undefined

var a = 12;

console.log(a);//12

console.log(window.a);//window[‘a‘]在‘全局作用域’中,我们声明了一个变量,相当于全局对象window增加了一个属性名

```

> [不带var]

> 在全局作用域中,如果不带var,仅仅是给全局对象设置了一个新的属性名(把window.省略了)

```javascript

// console.log(a);//=>Uncaught ReferenceError: a is not defined

a = 12;//<=>window.a=12

console.log(a);//=>12

console.log(window.a);//=>12

```

window.setInterval();//window.可以省略

window.document.getElementById();//window.可以省略

> 项目中,如果你的目的是创建变量,最好不要省略var,这样会严谨一些

### 作用域链

> 函数执行形成一个私有的作用域(保护私有变量),进入到私有作用域中,首先变量提升(声明过的变量是私有的),接下来代码执行

> 1、执行的时候遇到一个变量,如果这个变量是私有的,那么按照私有变量处理即可;

```javascript

function fn() {

//=>私有作用域

//变量提升:var a;(私有变量)

console.log(a);//->undefined

var a = 12;

console.log(a);//->12

}

fn();

console.log(a);//->Uncaught ReferenceError: a is not defined 闭包机制:私有作用域保护里面的私有变量不收外界的干扰不收外界的干扰

```

> 2、如果当前这个变量不是私有的,我们需要向它的上级作用域进行查找,上级如果也没有,则继续向上查找,一直找到window全局作用域为止,我们把这种查找机制叫做**`作用域链`**

> 1)如果上级作用域有,我们当前操作的都是上级作用域中的变量(假如我们在当前作用域把值改了,相当于把上级作用域中的这个值给修改了)

> 2)如果上级作用域中没有这个变量(找到window也没有);

> 变量 = 值:相当于给window设置了一个属性,以后再操作window下就有了

例子:

//=>变量提升:var x;var y; fn=>aaafff111

console.log(x, y);

var x = 10,

y = 20;

function fn() {

//=>[私有作用域]

//=>变量提升:var x;(x是私有变量)

console.log(x, y);//=>undefined 20

var x = y = 100;//=>x=100(私有)y=>100(全局)

console.log(x, y);//=>100 100

}

fn();

console.log(x, y);//=>10 100

结果:

undefined undefined

undefined 20

100 100

10 100

注意事项:

// var x = 10,y=10;等同于 var x = 10;var y =10;

// var x = y = 100;

// var x = 100;(私有)

// y = 100;//->此处的y是不带var的(全局)

```javascript

function fn(){

a = 12;

console.log(a);//->12

}

fn();

console.log(a);//->12

```

原文地址:https://www.cnblogs.com/kpengfang/p/9865683.html

时间: 2024-10-09 09:35:35

js作用域链以及全局变量和局部变量的相关文章

针对JS经典题型对全局变量及局部变量的理解浅谈

第一次写博,还蛮激动... 看到了三题经典题型,经老师讲解后,对此类题目有了更深刻的认识 就我目前的认识对此题进行总结.如有错误,敬请指正 首先,我们先明确一下JS引擎的工作步骤: js引擎工作分为两步: 1.将这个js中的变量和函数声明保存到当前(注意,是当前)执行环境的变量对象中 2.再逐行解析执行js.当看到一个函数或一个变量时,js引擎就会去查询 这个函数或变量是在哪里定义的 查询的方式有两种: a.按作用域链查找:先在当前执行环境查询这个变量或程序,如果没有,就到父执行环境 中查找,还

js 作用域链&amp;内存回收&amp;变量&amp;闭包

闭包主要涉及到js的几个其他的特性:作用域链,垃圾(内存)回收机制,函数嵌套,等等 一.作用域链:函数在定义的时候创建的,用于寻找使用到的变量的值的一个索引,而他内部的规则是,把函数自身的本地变量放在最前面,把自身的父级函数中的变量放在其次,把再高一级函数中的变量放在更后面,以此类推直至全局对象为止.当函数中需要查询一个变量的值的时候,js解释器会去作用域链去查找,从最前面的本地变量中先找,如果没有找到对应的变量,则到下一级的链上找,一旦找到了变量,则不再继续.如果找到最后也没找到需要的变量,则

Js作用域链及变量作用域

要理解变量的作用域范围就得先理解作用域链 用var关键字声明一个变量时,就是为该变量所在的对象添加了一个属性. 作用域链:由于js的变量都是对象的属性,而该对象可能又是其它对象的属性,而所有的对象都是window对象的属性,所以这些对象的关系可以看作是一条链 链头就是变量所处的对象,链尾就是window对象 看下面的代码: function t() { var a; function t2() { var b; } } js中函数也是对象,所以变量a所在的对象是t,t又在window对象中,所以

js作用域链中变量提前的问题

js訪问变量是从内到外,这条作用域链上面的每一个活动变量也是从内到外的.比方一个函数,首先由arguments和函数内部声明的变量,然后是外层的能訪问的变量.直至最后window全局对象.当出了这个函数,函数内部声明的活动对象就会销毁,所以外部滴根本无法訪问函数内部声明的对象的.之所以说js会把全部的变量提前也是针对不同的作用域的,在最外面.则是把全部的全局变量和全局的函数声明提前,在函数内部,则是先把函数内部声明的变量和函数提前

JS作用域链

Js作用域与执行环境: 1. 作用域链: <1>用途:保证对执行环境有权访问的所有变量和函数的有序访问. <2>构成: a.作用域链的前端,始终都是当前执行代码所在环境的变量对象(如果这个环境是函数,则将其活动对象作为变量对象,活动对象在最开始时只包含一个变量,即arguments对象): b.下一个变量对象来自包含(外部)环境: c.最后一个对象,为全局执行环境的变量对象. <3>标识符解析:是沿着作用域链一级一级地搜索标识符的过程,始终从作用域链的前端开始,然后逐级

[js]作用域链查找规则获取值和设置值

作用域链查找规则获取值和设置值 <script> /** 1.作用域链查找规则 私有作用域出现的一个变量不是私有的,则往上一级作用域查找,上级作用域没有则继续向上级查找,一直找到window为止,如果window也没有了? 1)如果是获取值,则报错 2)如果是设置值,则相当于给window设置了一个属性 2.js代码一旦报错,则不往下执行了. */ function fn() { console.log(total); //获取值 total = 100; //设置值 } fn(); cons

【动画演示】:JS 作用域链不在话下

作者:Lydia Hallie译者:前端小智来源:dev 点赞再看,养成习惯 本文 GitHub https://github.com/qq44924588... 上已经收录,更多往期高赞文章的分类,也整理了很多我的文档,和教程资料.欢迎Star和完善,大家面试可以参照考点复习,希望我们一起有点东西. 本篇我们来看看啥是作用域以及作用域链,首先,来看看下面的代码: const name = "Lydia" const age = 21 const city = "San Fr

js基础第一天 (全局变量,局部变量)

前言:今天我把变量这块内容单独放出来,是我觉的这也是个重点,我很早就知道变量这个东东,可惜一直半懂不懂的,每次出现复杂的写法我就蒙圈了,今天我利用的好长时间把这块内容弄明白. 初学者可以看看我下面的案例和详细解释,你们一定会恍然大悟,我今天就是这样的感觉.虽然每天进度很慢,但是每天都有收获,这就是积累成多. 现在感觉每天的时间不够用,时间过的超快.今天过的都不知道是星期几了. 声明全局变量 1.最外层执行环境下声明的变量是全局变量 2.不用var声明的变量是全局变量 全局变量特点:任何作用域下都

Js 作用域链(是指AO链)

1:参数 2:局部变量声明 3:函数声明 * 函数声明与函数表达式的区别 表达式必有返回值,把返回值(即匿名函数)赋给了一个变量. 此时 就是普通的赋值过程. ①.js并不是一句一句顺序执行的,先进行词法分析 This, 与 arguments 当一个函数运行的时候,函数内部能引用的变量有这么几种 AO.arguments.this 对于 arguments和this, 每个函数都有自己独有的arguments和this, 且不进行链式查找 arguments是什么? 答:1:arguments