博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javascrip高级程序设计的学习笔记【作用域和执行环境】
阅读量:5883 次
发布时间:2019-06-19

本文共 2383 字,大约阅读时间需要 7 分钟。

javascript变量可以用来保存两种类型的值:基本类型和引用类型。基本类型包括以下5种:undefined、Null、string、Boolean、Number等, 引用类型是object;基本类型和引用类型都具有几下特点:

1、基本类型值在内存中占据固定大小的空间,因此基本类型的值被保存在栈内存中;

2、从一个变量向另一个变量复制基本类型的值,会创建这个值的副本。

3、引用类型的值是对象,保存在堆中;

4、包含引用类型值的变量实际并不是包含对象本身,而是一个指向该对象的指针;

5、从一个变量向另一个变量复制引用类型的值,复制的其实是指针,因此两个变量始终指的同一个对象;

6、确定一个值是哪种基本类型可以用typeof操作符,而确定一个值是哪种引用类型可以用instanceof操作符‘;

var num1=5;var num2=num1;num2=6;num2;//6num1;// 5var  obj1=new Object();var obj2=obj1;obj1.name="dd";alert(obj2.name);//"dd" 指向的是同一个对象;地址相同nvar obj1=new Object();var obj2=new Object();//两个对象,地址也不一样
var s="ddd";var b=ture;var c=22;var u;var n=null;var 0=new function();alert(typeof s);//string;alert(typeof b);//boolean;alert(typeof u);//undefined;alert(typeof n);//object;alert(typeof 0);//object;

确定是哪种引用类型时,用instanceof

alert(persons instanceif object);//变量person是object吗?alert(colorss instanceif array);//变量colors是array吗?alert(pattern instanceif RegExp);//变量pattern是RegExp吗?

函数的预处理(提升)

alert(a);var a=123;//执行的结果是undefined;程序相当于是: var a;                   alert(a);                   a=123;

函数的执行第一步要进行预处理,然后再一步步执行代码,看实例

第一步预编译 var a;  function a() {alert(123);}第二步一步步执行代码:     alert(a);//function a() {alert(123);}     a=1;    alert(a);//1    alert(a)://1    a();//报错,相当于1();

js没有按引用传参的功能,切忌,不能把传递引用参数当做按引用传参

function setName(obj){          obj.name="dddd";}var person=new object();setName(person);alert(person,name);//ddd这里是按质传参的

同级函数的作用域不是嵌套的,不能访问

function f1(){   var b=2;   alert(b);    f2();}function f2(){    var d=3;    alert(d);    alert(b);//不出现b}

但是如果是这样的嵌套函数f2()嵌套在f1()作用域中,f1()作用域嵌套在全局作用域中,形成了作用域链;

function f1(){   var b=2;   alert(b);    function f2()  {    var d=3;    alert(d);    alert(b);//2  }}

for语句和if语句没有封闭作用域的功能,都是全局的

所有变量都存在于一个执行环境(也称作用域)当中,这个环境决定了变量的生命周期,以及哪部分代码可以访问其中的代码,以下是总结:

1、执行环境有全局执行环境和函数执行环境之分;

2、每一次进入一个新的执行环境,都会创建一个用于搜索变量和函数的作用域链;

3、函数的局部环境不仅有访问函数作用域中的变量,而且有权访问其包含(父类)环境、乃至全局环境;

4、全局环境智能访问在全局环境中定义的变量和函数,而不能直接访问局部环境中的任何数据;

5、变量的执行环境有助于确定如何释放内存;

javascript语言是一门具有自动垃圾收集机制的编程语言,开发人员不必关心内存分配和回收问题:可以对javascript的垃圾收例程作如下总结;

1、 离开作用域的值将自动标记为可以回收,因此将在垃圾收集期间被删除;

2、“标记清除”是目前流行的垃圾收集算法,这种算法的思想是给当前不使用的值加上标记,然后再将其回收

3、解除变量的引用不仅有助于消除循环引用对象,而且对垃圾收集也有好处,为了确保有效地回收内存,应该及时解除不再使用的全局对象,全局对象属性以及循环引用变量的引用;

function  createPerson(name){    var localPerson=new Object();   localPerson.name=name;   return localPerson;}var  dd=createPerson("dddd");dd=null;//手工解除dd的引用

 

转载于:https://www.cnblogs.com/whyx/p/4440157.html

你可能感兴趣的文章
Java设计模式9:代理模式
查看>>
vim ctl+v批量添加/删除
查看>>
理解Angular中的$apply()以及$digest()
查看>>
BIEE 维表
查看>>
WritePrivateProfileString GetPrivateProfileString 读取写 配置文件
查看>>
Window 分布式 学习2----好文收藏
查看>>
安卓图表引擎AChartEngine(五) - Dataset和Render参数介绍
查看>>
代码分析工具推荐Understand
查看>>
PHP中全局变量的使用global和$GLOBALS[]
查看>>
一行代码解决各种IE兼容问题,IE6,IE7,IE8,IE9,IE10 http://www.jb51.net/css/383986.html
查看>>
消息中间件选型
查看>>
JS组件系列——表格组件神器:bootstrap table
查看>>
chromium的安装程序
查看>>
【ThinkingInC++】61、非成员运算符
查看>>
Navigation Drawer的使用及遇到的问题
查看>>
多表利用DIH批量导入数据并建立索引注意事项
查看>>
实现的方法中,抛的异常只能比父类或接口中的少(转)
查看>>
NPOI.dll学习
查看>>
USBWebServer 中文便携版 快速搭建 PHP/MySQL 网站服务器环境
查看>>
lintcode :最近公共祖先
查看>>