这是红宝书(JavaScript高级程序设计 3版)的读书笔记第四篇,是红宝书第四章内容(主要是变量和做用域问题),固然其中还有我我的的理解。红宝书这本书能够说是难啃的,要看完不容易,挺厚的,要看懂更不容易,要熟练js更是难,中间须要不断的积累与重温。所以不是读一两遍就能把这书吃透,须要多读,可谓温故而知新,能够为师矣。javascript
同系列:
第一篇:JavaScript--我发现,原来你是这样的JS(一)(初识)
第二篇:JavaScript--我发现,原来你是这样的JS(二)(基础概念--躯壳篇,不妨从中文角度看js)
第三篇:JavaScript--我发现,原来你是这样的JS(三)(基础概念--灵魂篇)html
javascript 中的变量是松散型的,既不用去指定改变量的数据类型值,声明变量时直接使用一个操做符var就行。java
//声明变量 var str = 'string'; var num = 123; //当不用var时,则为全局变量但不推荐这样操做 i = 123;
js的变量有两种不一样的数据类型的值:基本类型的值和引用类型的值。git
//基本类型的值 var num = 123; var boo = false; //引用类型的值 var obj = new Object(); var arr = new Array(); var arr2 = {};
动态的属性怎么理解:就是能够动态的增长,删除,改变属性和方法github
//基本类型的值 var str = '123'; //添加属性 str.age = 123; console.log(str.age); //undefined,说明该值没被声明,因此基本类型属性没有动态的属性
//引用类型的值 var person = new Object(); //添加属性name person.name = 'ry-yuan'; //添加方法sayHi person.sayHi = function(){ console.log('hi'); } console.log(person.name); //输出ry-yuan person.sayHi(); //输出hi
var n1 = 100; //n1复制给n2 var n2 = n1; console.log(n2); //100 //对n2操做自增 n2++; console.log(n1); //100,n1不会受n2影响 console.log(n2); //101
//引用变量值 var o1 = new Object(); //复制o1给o2 var o2 = o1; //为o1添加属性 o1.name = 'ry-yuan'; //o2也会有这个属性值 console.log(o2.name); //'ry-yuan'
为何引用类型会指向同一个对象?由于o1中存着的值只是一个对象的引用地址,因此o1复制到o2时就把地址复制给o2,二者的地址相同,因此指向同一个对象。web
这里的传递参数是对函数传递参数。函数参数的按值传递的。传递参数的二者的区别和上面复制的同样。数组
var n = 123; function add(num){ num ++; console.log(num); } //将n传给函数add add(n); //124 console.log(n); //123,n不会被影响
//引用类型 var p = new Object(); function addName(obj){ obj.name = 'ry-yuan'; } console.log(p.name); //undefined,对象没有name属性 //将p传进函数 addName(p); console.log(p.name); //ry-yuan,对象有了name属性
typeof
来确认变量是什么基本数据类型var num = 666; var str = "hello ry"; var boo = false; var und = undefined; var n = null; console.log(typeof num); //number console.log(typeof str); //string console.log(typeof boo); //boolean console.log(typeof und); //undefined console.log(typeof n); //object,特别的null返回的是object
instanceof
操做符,判断它是什么类型的对象。不用typeof的缘由是typeof检测引用类型都会返回object,这不是咱们想要的,咱们想知道它是什么类型的object//这里想知道arr是否是数组类型,若是是返回true,不是返回false console.log(arr instanceof Array); //这里想知道arr是否是正则类型,若是是返回true,不是返回false console.log(arr instanceof RegExp);
instanceof
去判断基本类型值都会返回false,由于基本类型数据都不是object,就更不用判断是什么类型的object了。做用域:是变量与函数的可访问范围,即做用域控制着变量与函数的可见性和生命周期。在JavaScript中,变量的做用域有全局做用域和局部做用域两种。浏览器
最外围的一个执行环境,在web浏览器中,全局执行环境被认为是window对象,所以全部的全局变量和函数都是做为window对象的属性和方法建立的。安全
局部执行环境是指在函数内部,函数被建立,就会有一个函数做用域,在函数内定义的变量和方法,函数外面不能访问,但函数内能够访问外面的变量和方法。函数
//声明一个全局变量,当前最外围是全局做用域 var g = 1; //声明函数fn1 function fn1(){ //局部做用域 //声明一个变量 var i = 10; //能够访问g console.log(g); //1 //再声明一个函数fn2 function fn2(){ //局部做用域 var j = 100; //能够访问g和i console.log(g); //1 console.log(i); //100 } //fn1不能访问到fn2里面的变量和方法 console.log(j); //报错,j没被定义 } //全局做用域中不能访问i,j console.log(i); //报错,i没有被定义 console.log(j); //报错,j没有被定义
上图:
全局做用域中只能访问红颜色中有的变量和函数,有g和fn1
局部做用域fn1中能访问红色+蓝色中的变量和函数,有g,i,fn1,fn2
局部做用域fn2中能访问整个全部的变量和函数g,i,j,fn1,fn2
综上越里面的做用域访问的就越多。有种不能渗透到内部,只能向外拓展的感受。
什么是块级做用域:用大括号括起来的区域{ coding.... }
js中没有块级做用域,因此有一下这种状况:
for(var i =0 ; i<10 ; i++){ console.log(i); } console.log(i); //10 ,这里会有结果,i没有被销毁
查询标记符怎么操做?
来个例子:
var a = 1; function getNum(){ return a ; } console.log(getNum()); //1
咱们来分析一下变量a 的查找过程:
1.首先在getNum函数做用域中找,发现没有a变量
2.因而向外拓展,到了全局做用域,发现,哎,有a,var了个a,没错就是你了。而后得到这个a。
再来一个例子:
var b = 1; function get(){ var b = 2; return b; } console.log(get()); //2
此次又是怎么操做:
1.在执行函数get时,咱们声明了一个b变量,return时须要用到b,这时咱们在局部做用域中找,哎,有了,有个b变量,就是你了,而后就返回了。不用再到外面找了。
答:javascript中垃圾收集机制是自动回收的,不用人工操做,这让咱们更专一于编辑代码上。 回收垃圾机制是定时执行的,具备周期性。
答:在做用域中当整个做用域中的代码执行完后,做用域中的变量和方法都会没用,此时就是被当作垃圾了。好比局部做用域,一个函数执行完,里面的变量就能够被销毁,其占用内存被释放。
答:经常使用的是标记清除:这样操做:一个变量-->进入环境(被标记,有此标记为不能被清除)-->执行-->离开环境(被标记,这个标记告诉机制能被清除)-->回收机制一段周期后,变量被清除。
答:分配给web浏览器的内存比桌面的应用的内存少,这是出于安全考虑,为了防止运行js的网页耗尽系统内存致使系统崩溃。因此,开发者发现一旦数据再也不用时,就将其值设为null来释放其引用(解除引用),这作法适用于全局变量和全局对象属性。
博文很久没更新啦,堕落了,啊啊啊啊,努力努力,积极向上。最近挺多事。不能挡我学习,统统闪开。
本文出自博客园:http://www.cnblogs.com/Ry-yuan/
做者:Ry(渊源远愿)
欢迎访问个人我的首页:个人首页
欢迎访问个人github:https://github.com/Ry-yuan/demoFiles 欢迎转载,转载请标明出处,保留该字段。