• JS作用域-面向对象


    1. 其它语言是以代码块作为作用域的。下面程序会报错(如C,C++中),因为局部变量name只在{   }代码块中生效。打印console.writeline(name)中的name时就会报错。

      public void Func(string v) {
    
      if(1==1){
    
        string name='Jave';  
    
      }
    
      console.writeline(name);
    
      }
    
      Func( )  //报错
    

     修改如下,才能正常运行:

      public void Func(string v) {
    
      if(1==1){
    
        string name='Jave';
           console.writeline(name);   
    
      }  
    
      }
    
      Func( )  //正常运行
    

    2.Python:冒号+缩进作为一个代码块。在其它语言中是以代码块作为作用域的,在Python中是以函数作为作用域的。如下模块可以正常运行。

      def func():
    
        if 1==1:
    
          name='alex'
    
        print(name)
    
      func() 
    

     如下就会报错:

      def func():
    
        if 1==1:
    
          name='alex'
    
        print(name) 还在作用域范围内
    
      func() 
        
        print(name) 已经出了作用域,此处会报错。
    

    3. Javascript:

    1)Javascript 默认是以函数作为作用域的。(let关键字函数除外)。与Python一样。下列代码可以正常运行。

          

    function func(){
        if(1==1){var name="alex";}
                console.log(name);
    }
    func()
    

    2)函数的作用域在函数未被调用之前,就已经创建。当解释器去解释它或者编译它的时候,这个作用域就已经被创建了。尽管此时函数还未被调用。      

    3)函数的作用域存在作用域链(函数里面套函数 or 作用域里面套作用域),并且也是在被调用之前创建。

    执行结果是tony,先从内部找,找不到的话,一层一层往外找。

    在浏览器中写代码的时候,有回车的话,需要shift+回车。否则立马就执行了。 

    a="alex"
    function func(){
        var a="eric";
      function inner(){
          var a="tony";
          console.log(a);
    }
    inner()
    }
    func()

    在JS中探讨一下如下代码,可以在浏览器中看执行结果,

    a='alex';
    function func(){
        var a='eric';
        function inner(){
            console.log(a);
        }
        return inner;
    }
    var ret=func();
    ret();
    

     截图:

    修改代码,继续探讨:此时的输出结果是Tony。

    a='alex';
    function func(){
        var a='eric';
        function inner(){
            console.log(a);
        }
        var x="tony";
        return inner;
    }
    var ret=func();
    ret();
    

     分析作用域:

    4.) JS中,函数内部的局部变量会又一个提前声明的操作。

    当一个变量根本就没有定义的时候,如果此时调用的话,程序会直接报错。

    当一个变量声明了,但是没有赋值的时候,如果此时调用的话,程序会返回undefined。

    在这里要注意,解释器解释的时候,遇到局部变量,会在内部执行一句 var xxoo的代码,相当于定义了一个xxoo的变量,只不过没有赋值。所以此时的返回结果是undefined,而不会报错。

    function func()
        console.log(xxoo);
        var xxoo="alex";
    func()
    //undefined 执行结果返回undefined
    

     如下代码,没有定义变量就直接引用,会报错。

    function func()
        console.log(xxoo);
    func()
    //报错
    

    4. JavaScript也支持面向对象。

    1)一般函数如下:

    function foo(){
        var xo="alex";
    }
    foo()
    

     面向对象的函数:this相当于Python中的self。接下来不是调用函数,而是创建对象。对象前面都必须要加上new.

    function Foo(n){
        this.name="alex";
    }
    var obj=new Foo("we");
    obj.name
    

    A- this 代指当前调用它的那个对象(相当于Python中的 self)

    B-创建对象时,new 函数()

    再复杂一点,类里面可以定义字段(变量),也可以定义函数。

    //创建了一个类
    function Foo(n){ this.name="alex"; this.sayName=function(){ console.log(this.name) } }
    //创建对象obj1 var obj1=new Foo("we"); obj1.name obj1.saNname() //会执行那个函数

    var obj2=new Foo("wee"); 
    obj2.name
    obj2.saNname() //会执行那个函数

     JS中,调用几次,就会创建几次函数,这样太浪费空间。

    在Python中,是把函数定义到类里面,只定义一次就可以了。

    所以需要把函数放到一个公共调用区域。

    #创建了一个类,也就是构造方法。
    function Foo(n){
        this.name=n;
    }
    #prototype是当前Foo的原型,Foo只创建一次,Foo的原型也就只创建一次。
    Foo.prototype={
        'sayName':function(){
            console.log(this.name)
        }
    }
    
    
    obj1=new Foo('we');#此时obj1里面只封装了一个name
    obj1.sayName() #通过obj1先找到Foo这个类,然后去类的原型里面再去找sayName函数。
    obj2=new Foo('wee');
    obj2.sayName()
    

     图解:

    类里面可以指向原型,当通过  对象.方法 执行类的时候,类会自动帮我们去原型里面找。

  • 相关阅读:
    jvm 更多链接
    JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )
    python 排序
    python 第K个语法符号
    python conf.ini 文件的使用
    python 表示数字
    window 下安装redis
    python redis相关操作
    python 矩阵乘法
    python 查找两个字符串a,b中的最长公共子串
  • 原文地址:https://www.cnblogs.com/momo8238/p/7446113.html
Copyright © 2020-2023  润新知