JS作用域及变量的认识

    xiaoxiao2021-08-20  122

           JS一直以来可谓是前端技术中一大难关,学也容易,但想学的有深度可谓是十年磨一剑,有点儿夸张了。总之,非一朝一夕之就,多研究研究,多问问为什么,就OK。

    对于JS入手并不是很长的发烧友来说,一些基础还是有必要弄得扎实。

        JS作用域,作用域的理解可以让我们更好的去做到变量的公有和变量的私有化。

       主要就写一些容易出现知识上亏欠的理解。

       1.预解析

         在代码执行前,计算机会分配空前来存贮变量。并不是一开始就把所有变量就存储起来,实际上那些公用的变量才会被存贮起来,也就所谓的全局变量。而全局变量它在代码的任何地方都是存在的,你可以在任何位置去调用,不过受到作用域的限制,会有层级的去查找,当然也就从自身的作用域一层层往外找,也就有着就近原则。

       

         所谓的预解析,就是在代码执行之前,它会分配一个内存空间给变量,但是并没有赋值,而赋值是发生在代码执行的过程中的, 

        比方说:   

                     代码段1: console.log(a)        ----------------------------》undefined;

                                        var a=123;

                   这段代码的程序处理是这样的,一开始发生预解析:var a ;     然后预解析完毕,此时a并没有赋值.执行整段代码,  console.log(a)自然就是undefined,接着var a=123,才开始赋值;

    2.如果是一个普通函数,也是如此;

       比方说,function A(){};

                   预解析发生时,存储的是一个地址,它指向这个函数,其实跟上面也很类似;

    3.函数的调用,是在自身的作用域,而不是调用它的作用域,比方说闭包;

                 function A(){

                     var m=456;

                          function b(){

                              var n=123;

                              this.name=name;

                                .....其他 执行代码块

                                }

                         return b;

               }

         在JS中作用域存在两种形式,一种是全局的,可以公用,一种是私有的也就是局部的,被保护影藏起来,当然可以通过建立特权,也就所谓的接口来访问;

    在这个例子中,b函数存在一个n,还有一个this, n是个在b函数作用域中申明的一个变量,this它经常容易难倒刚入门的JS新手,会经常看到this指的是谁调用了这个函数,那么该函数里的this就指向它。实际上也可以理解为:谁调用了这个函数,那么这个函数就是它的属性,或者叫做方法,那么这个函数里的this指向它.在JS中,所有变量都是window的属性,只不过这里有个前提,全局变量自然是window的属性,而那些私有的变量只有当在进行执行的时候才会被申明并存储,此时就成了window的属性,不过在函数调用完毕之后又销毁了,继而又调用那些局部函数,又重新这样分配空间,执行,销毁,一直到整个程序运行完毕。

          先看看函数调用的集中方式:

          <1>    function fn(){ this.name=name  };

                    情况一;自我调用 -------------

                                             fn();   

                   这个并没有任何人去调用,但是fn是这个函数却是window的属性,所以this指的是window.  

       <2> var a=function A(){ return this};                          

                调用方式: a();                                  //window;

                                A()                         //报错了

                而A()这样执行这个函数就会报错;先看报错这样的问题吧,在这条语句中,预解析过程中,存贮了变量a,那么a就一定是window的属性,而A却并没有申明,分配内存空间,反过来理解也就是赋值只能在预解析完毕后执行代码期间才会进行变量的空间分配,不过执行完毕就自动销毁了。这里有必要再重复一遍前面的一句:函数的执行是在身的作用域,而不是在调用它的作用域;

           可以用这样的模式来辨别:   a.b=function(){ return this}   ;    this.指向a;          所谓的这个函数属于谁的属性或者说是谁的方法,this就指向谁.

           function (){ return this}      以及  function A(){return this}    这两种this都指向window   他们不是任何谁的属性和方法,那么就是window的属性和方法;

    <3>变量 

         var 申明的,this关键字,以及函数中的参数都是变量,他们只存在自身的作用域,当然自身的作用域可能是全局的,全局的也就可以访问到,私有的也就保护起来不让外界访问,不用var 申明的变量是全局变量的存在。对于访问那些私有的成员,比方说私有属性和方法,可以通过其他突进,比方原型链继承,冒充等方式。

                

                 

    转载请注明原文地址: https://ju.6miu.com/read-676761.html

    最新回复(0)