两链一包

本文深入探讨了JavaScript中的三大核心概念:作用域链、闭包和原型链。详细解释了作用域链如何在函数创建时确定变量查找路径,闭包如何允许函数记住并访问其外部作用域中的变量,以及原型链如何实现对象间的属性和方法继承。

1、作用域链 -- 要到创建这个函数的那个作用域中取值——是“创建”,而不是“调用”

  如果代码中只有声明没有赋值,显示 undefined

  如果既无声明也没赋值,就会报错

        var a=10;
        function f1(){
            var b=20;
            function f2(){
                // 当前作用域没有此变量时,逐级往父作用域上面找
                var c = 30;
                console.log(a)  // 自由变量
                console.log(b)  // 自由变量
                console.log(c)
            }
            f2()
        }
        f1()    

 

2、闭包

  闭包的使用场景

   1、函数作为返回值

   2、函数作为参数传递-----要到创建这个函数的那个作用域中取值——是“创建”,而不是“调用

        function F1() {
            var a = 10;  //如果这条代码消失,a会取上一级作用域的值
            console.log('b')
            return function () {
                console.log(a) // a 为自由变量
            }
        }

        var f1 = F1();
        var a = 20;
        // f1(); // 10

        function F2(fn){
            var a=30;  // a不会取调用它的作用域的值
            fn()
        }

        F2(f1) // 10        

 

3、原型链

  在访问对象的属性和方法时, 会在当前对象中查找, 如果没有找到, 会一直沿着原型链上的原型对象__proto__向上查找, 直到找到Object.prototype(原型的顶端)为止,这就是原型链。

       function Dog() {
            this.eat = function () {
                console.log('喜欢吃骨头')
            }
        }

        function Cat() {
            this.food = function () {
                console.log('喜欢吃鱼')
            }
        }

        Cat.prototype.weight=function(){
            console.log('不重')
        }

        Dog.prototype = new Cat();
        var dog = new Dog();
        
        dog.eat() //  喜欢吃骨头
        dog.food() //  喜欢吃鱼 
        dog.weight() //  Cat的原型对象的方法会被继承下来    

 

转载于:https://www.cnblogs.com/dawnwill/p/9876293.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值