查找私有变量
JS中的私有变量有且只有两种
在私有作用域变量提升阶段,声明过的变量(或者函数)
形参也是私有变量
1.function fn(num1,num2){
2. var total = num1+num2;
3. return total;
4.}
5.var result = fn(100,200);
1.//=>全局变量提升:var x; var y; var z; fn=AAAFFF000;
2.var x = 10,
3. y = 20,
4. z = 30;
5.function fn(x, y) {
6. //=>[私有作用域]
7. //=>形参赋值:x=10 y=20 (x/y都是私有变量)
8. //=>变量提升:var x(忽略的,已经存在x这个名字了)
9. console.log(x, y, z);//=>z不是私有变量是全局变量 10 20 30
10. var x = 100;//=>私有的x=100
11. y = 200;//=>私有的y=200
12. z = 300;//=>全局的z=300
13. console.log(x, y, z);//=>100 200 300
14.}
15.fn(x, y, z);//=>FN执行传递的是实参(实参都是值) fn(10,20,30)
16.console.log(x, y, z);//=>10 20 300
1.function fn(b) {
2. //=>[私有作用域]
3. //=>形参赋值:b=1 (私有变量)
4. //=>变量提升:b=aaafff111 (此处赋值操作替换了形参赋值的内容)
5. console.log(b);//=>函数
6. function b() {
7. //=>[私有作用域]
8. //=>形参赋值和变量提升都没有
9. console.log(b);//=>函数
10. }
11. b();
12.}
13.fn(1);
1.var n = 10;
2.function sum() {
3. console.log(n);
4.}
5.//sum();//=>10
6.~function () {
7. var n = 100;
8. sum();//=>SUM的宿主环境是当前自执行函数形成的私有作用域
9.}();
1.var n = 10;
2.var obj = {
3. n: 20,
4. fn: (function () {
5. //->上级作用域:全局作用域
6. var n = 30;
7. return function () {
8. //->上级作用域:自执行函数
9. console.log(n);
10. }
11. })()
12.};
13.obj.fn();//=>30
[图片上传失败...(image-c6a655-1570785249570)]
作用域链
函数执行会形成一个私有作用域(保护私有变量),进入到私有作用域中,若现变量提升(声明过的变量是私有的),接下来代码执行
1.执行的时候遇到一个变量,如果这个变量是私有的,那么就执行啊
2.如果当前这个变量不是私有的,我们就需要向他的上级作用域进行查找,如果上级没有,一直到找到window全局作用域为止,我们把这种查找机制叫做“作用域链”。
1) 如果上级作用域有,我们操作的都是上级作用域中的变量(假如我们当前作用域值改了,相当于把上级作用域中的值改了)
2)如果上级作用域到window没有这个变量
变量=值:相当于给上级作用域window设置了一个属性,以后再操作window下就有了
alert(变量):想要弹出这个变量,但是此时没有,所以会报错。
- [作用域链]
当前作用域代码执行的时候遇到一个变量,我们首先看一下它是否属于私有变量,如果是当前作用域私有变量,那么以后在私有作用域中在遇到这个变量都是操作私有的(闭包:私有作用域保护私有变量不受外界干扰);如果不是私有的变量,向其上级作用域查找,也不是上级作用域私有的,继续向上查找,一直到window全局作用域为止,我们把这种向上一级级查找的机制叫做作用域链;全局下有,操作的就是全局变量,全局下没有(设置:给全局对象window增加了属性名 && 获取:报错)
属性查找顺序
1.先去实例上找,若找到则用自身实例上的,若没有找到,则通过proto去所属类的原型上查找,若还没找到,继续通过proto去所属类的原型上查找...直到找到Object.prototype,若还没找到,则返回undefined ———>这样的过程就形成原型链
_proto_是实现在所属类的原型上查找的关键属性,是实现继承的关键属性
我们把对象数据类型实现 把描述同一件事务的属性或者特征归纳汇总在一起,以此避免全局变量冲突问题 的方式和思想叫做:单例设计模式
//=>单例模式
//1、singleton不仅仅是对象名了,在单例模式中,singleton称之为 “命名空间(nameSpace)”
var singleton={
xxx:xxx,
...
};
var singleton={
nameSpace1:{
xxx:xxx,
...
},
nameSpace2:{
xxx:xxx,
...
}
...
};
把描述同一件事务的属性或者方法存放在某一个命名空间下,多个命名空间中的属性和方法是互不干扰的
instanceof
用来检测当前实例是否隶属于某个类
function Fn(){}
var f = new Fn;
console.log(f instanceof Fn);//=>true
instanceof解决了typeof无法识别是数组还是正则的问题
[] instanceof Array //=>true
/^$/ instanceof Array //=>false
hasOwnProperty VS in
in:用来检测当前这个属性是否隶属于对象(不管是对象私有的还是公有的属性,只要有返回的就是true)
hasOwnProperty:用来检测当前这个属性是否是对象的私有属性(不仅要是对象的属性,而且需要是私有的才可以)
var obj={name:'珠峰培训',age:8};
'name' in obj //=>true
'sex' in obj //=>false
'hasOwnProperty' in obj //=>true hasOwnProperty是Object这个内置类中提供的属性方法,只要当前对象是Object的一个实例,就可以使用这个方法
obj.hasOwnProperty('name') //=>true
obj.hasOwnProperty('hasOwnProperty') //=>false
检测一个属性是否是当前对象的公有属性
1、是对象的一个属性
2、不是对象的私有属性
function hasPubProperty(attr,obj){
return (attr in obj) && (obj.hasOwnProperty(attr)===false);
}
hasPubProperty('hasOwnProperty',{xxx:'xxx'});
网友评论