JS学习之作用域

JS中的作用域有两种:

1.window/global 全局作用域

2.函数执行时形成的私有作用域

栈内存(作用域):js代码执行的那个环境;存储基本数据类型值;堆内存:在js中,对于引用数据类型来说,首先会开辟一个新的内存空间,然后把("属性名:属性值"/"函数体中的代码字符串")存储到这个空间中,最后把空间的地址给相关的变量,这个新开辟的这个内存空间称之为"堆内存"。堆内存的作用:存储引用数据类型值的

一、全局作用域

在浏览器加载我们HTML页面的时候,首先会开辟一个供js代码执行的环境,即全局作用域,这是一个栈内存

全局变量:在全局作用域下定义的变量

二、私有作用域

函数执行时形成一个新的私有作用域,这也是一个栈内存

私有变量:在私有作用域中经过预解释的变量,形参也是私有变量。

函数执行的顺序:给形参赋值-->预解释-->完成后私有作用域中的代码从上到下执行。

在私有作用域中出现的变量,我们首先看是否为私有变量,如果是私有变量,那么函数中用的都是私有的变量;如果不是私有的变量,则往上一级查找;

关于如何查找上级作用域问题:首先看当前的函数对应的堆内存是在哪个作用域下定义的,在谁下面定义的,它的上级作用域就是谁。

 1     var a = 12;
 2     function fn() {
 3         var a = 13;
 4         function f() {
 5             console.log(a);
 6         }
 7         return f;
 8     }
 9     function sum() {
10         var a = 14;
11         var f = fn();
12         f();//13 f对应的堆内存是在函数fn里面定义的,所以f的上级作用域是fn,所以里面用到的a找的是上级作用域fn中的13
13     }
14     sum();
15     var f=fn();
16     f();//13

关于作用域销毁与不销毁或者不立即销毁问题:

销毁的作用域:一般情况下,函数执行完成后,浏览器会把这个函数形成的私有作用域进行回收,当前的作用域都立即销毁。
不销毁的作用域:
当函数执行的时候,在私有作用域中返回了一个引用数据类型的值(例如:一个函数、一个对象、一个数组...),并且在函数的外面,有变量接收了这个返回值,此时当前的这个私有的作用域就被占用了,这个作用域也不能销毁了。作用域不销毁,里面的私有变量也不会被销毁(这跟下一篇要讲的闭包的应用有关)
 1     function fn() {
 2         var a = 12;
 3         return function () {
 4             a++;
 5             console.log(a);
 6         };
 7         var c = 13;
 8     }
 9     var f = fn();
10     f();//13
11     f();//14
不立即销毁的作用域:当函数执行的时候,在私有作用域中返回了一个引用数据类型的值(例如:一个函数、一个对象、一个数组...),但是并没有变量在函数的外面接收,那么浏览器暂时先不销毁,等到浏览器空闲的时候,会自己销毁这个作用域。
时间: 2024-08-01 23:00:30

JS学习之作用域的相关文章

js学习--变量作用域

作为一名菜鸟的我,每天学点的感觉还是不错的.今天学习闭包的过程中看到作用域与作用域链这两个概念,我觉得作为一名有追求的小白,有必要详细了解下. 变量的作用域 就js变量而言,有全局变量和局部变量.这里我觉得这个按字面意思理解就行了.......下面举个例子 var message = "今天我做的糯米蒸排骨"; //定义一个全局变量 function doL(){ var ss = "侠客行很好看"; //定义一个局部变量 alert(message); //输出&

JS 学习之作用域和变量解析

1 js 作用域跟C,java等语言的不同的地方: 1) 没有块级作用域 注意,若局部作用域var 了一个跟全局作用域相同变量名的变量,则局部作用域里面无法引用全局作用域的变量. 2) 局部作用域变量可以与全局作用域变量同名,但是前面要加var,注意,此后2者一点关系都没有,可以看作是一山不可容的二虎,两只老虎两只老虎. 2 变量解析 JS 变量解析涉及其词法分析的东西,具体的架构(自己的理解)如下: 执行环境 ↑ 作用域链(2种,全局和全局局部) ↑ 局部作用域和全局作用域 ↑ 变 量 后续时

Ext JS学习第三天 我们所熟悉的javascript(二)

•javascript之函数 •对于Ext开发者,我还是希望你能对javascript原生的东西非常了解.甚至熟练掌握运用.那么函数,无疑是非常重要的概念.首先在前面一讲,我们知道了函数也是一种数据类型,创建函数一共有三种方式.每种方式他们都会有区别,分别为: –function语句形式 –函数直接量形式 –构造函数形式 •函数中的arguments对象 –argument的作用一:接受函数的实际参数 –argument的作用二:用于做递归操作 栗子代码 1 //Function 函数 2 //

Angular JS 学习笔记

特定领域语言 编译器:遍历DOM来查找和它相关的属性, 分为编译和链接两个阶段, 指令:当关联的HTML结构进入编译阶段时应该执行的操作,可以写在名称里,属性里,css类名里:本质上是函数 稳定的DOM:绑定了数据模型的DOM元素的实例不会在绑定的生命周期发生改变 作用域:用来检测模型的改变和为表达式提供执行上下文的 AngularJS 和其它模板系统不同,它使用的是DOM而不是字符串 指令: 由某个属性.元素名称.css类名出现而导致的行为,或者说是DOM的变化 Filter过滤器:扮演着数据

JS学习笔记-OO疑问之封装

封装是面向对象的基础,今天所要学习的匿名函数与闭包就是为了实现JS的面向对象封装.封装实现.封装变量,提高数据.系统安全性,封装正是面向对象的基础. 匿名函数 即没有名字的函数,其创建方式为 function(){...} 单独存在的匿名函数,无法运行,可通过赋值给变量调用或通过表达式自我执行来实现运行. 1.赋值给变量为一般的函数使用方式 var run = function(){ return '方法运行中'; }; alert(run()); 2.通过表达式自我执行 (function(a

JS学习二

函数作用域和声明提前 var scope = 'global'; function f() { console.info(scope);   //输出undefined var scope = 'local'; console.info(scope);  //输出 local } 上述代码等价于 function f() { var scope; console.info(scope); scope = 'local'; console.info(scope); } 将函数内的变量声明"提前&q

Angular JS学习笔记

之前的学习方法有点盲目,建议以后只看与工作有关的内容,并且多问那些是只和工作有关联的. 遇到问题的时候,项目不急的话,自己研究,项目急的话,马上问. 方法不对,再努力也没有用. Angular JS学习网站:http://www.zouyesheng.com/angular.html#toc7 [  项目有关的内容 ] ng-model ng-click ng-options ng-repeat ng-if ng-show ng-hide ng-controller ng-href(有印象) {

JS学习:JavaScript的核心

分享到 分类 JS学习   发布 ourjs  2013-12-02 注意 转载须保留原文链接,译文链接,作者译者等信息. 作者: JeremyWei  原文: JavaScript The Core 对象 原型链 构造函数 执行上下文栈 执行上下文 变量对象 活动对象 作用域链 闭包 This 总结 这篇文章是「深入ECMA-262-3」系列的一个概览和摘要.每个部分都包含了对应章节的链接,所以你可以阅读它们以便对其有更深的理解. 面向读者:经验丰富的程序员,专家. 我们以思考对象的概念做为开

区分词法作用域(js)与动态作用域(精!)

在js学习中,词法作用域是必须要掌握的! 在这里,我将总结一下<你不知道的JS>一书中词法作用域的重点并分享给大家! 首先带来一段代码示例: function foo(){ console.log(a);//2 } function bar(){ var a = 3; foo(); } var a = 2; bar(); js词法作用域输出结果:"2"; 动态作用域输出结果:"3" 下面我将对两种作用域的输出结果进行分析: #在对结果分析之前首先我们要了