美文网首页
作用域链

作用域链

作者: 田成力 | 来源:发表于2019-10-11 17:14 被阅读0次

查找私有变量

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'});

相关文章

  • 作用域链和闭包

    在谈作用域链之前先说一下与作用域链关系紧密的执行环境和作用域。 作用域:作用域指的是变量的适用范围。 作用域链:作...

  • 作用域链

    作用域链 把多个作用域串起来便形成了作用域链;每个函数在初始化完成之后就拥有了各自的作用域链,但此时的作用域链中并...

  • web性能实践

    一. 作用域 前面我们了解作用域概念的以及作用域链是如何运作的。 随着作用域链中的作用域数量的增加,访问当前作用域...

  • JS_0: 执行环境和作用域链

    JavaScript,目前对于执行环境和作用域链的理解 什么是作用域链? 要讲作用域链就得先讲执行环境。 每个函数...

  • js 总结七07-19

    作用域 全局 局部 作用域链 闭包

  • 作用域和闭包

    作用域链 (据我所知)所有的编程语言都存在作用域链。整个代码存在全局作用域、函数作用以及块级作用域。 上述代码将会...

  • 2023-01-12

    变量提升调用栈块级作用域作用域链和闭包 闭包 => 作用域链(词法作用域) => 调用栈(栈溢出) => 上下文...

  • JavaScript 作用域链与闭包

    作用域链与闭包 了解作用域链之前需要先了解下作用域是什么。 作用域 几乎所有的语言都有作用域的概念。这是因为它们都...

  • 作用域/作用域链 闭包及其使用

    一、作用域、作用域链 作用域(scope) 浅显的理解: 作用域就是变量的可用范围(scope) 为什么要有作用域...

  • 作用域链

    作用域链(scope chain) 理解: 作用域链决定了哪些数据能被函数访问。当一个函数创建后,它的作用域链会被...

网友评论

      本文标题:作用域链

      本文链接:https://www.haomeiwen.com/subject/tccxmctx.html