• js考察this,作用域链和闭包


    在严格版中的默认的this不再是window,而是undefined。

    先看两个例子

    example one

          var num = 20;
          var obj = {
            num: 30,
            fn: (function() {
              this.num *= 3;
              num += 15;
              var num = 45;
              return function() {
                this.num *= 4;
                num += 20;
                console.log(num)
              }
            })(num)
          };
          var fn = obj.fn;
          fn(); //因此时num是在fn函数定义的是个局部变量,num会自动找在哪里定义的找到初始值再计算,即45+20=65
          obj.fn(); //因fn()执行的时候num改变成65了, 65+20=85
    

    example two

          var num = 20;
          var obj = {
            num: 30,
            fn: (function() {
              this.num *= 3;
              console.log(this) //因这里是个自执行函数的
              num += 15;
              var num = 45;
              return function() {
                this.num *= 4;
                num += 20;
                // console.log(this.num)
              }
            })(num)
          };
          var fn = obj.fn;
          fn(); //因此时this指向window,在自执行函数执行的时候,this.num *= 3;此时window.num = 60,执行fn(),60*4 = 240
          obj.fn(); //120 此时this指向obj,this.num = 30,  30*4 = 120
    

    知识点一:this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象

    (function(){
        //浏览器中this指向window
    }());
    
    function a() {
        console.log(this)
    }
    a() //window
    

    知识点二:当this碰到return时

    如果函数返回值为常规意义上的值类型(Number、String、Boolean)时,new函数将会返回一个该函数的实例对象,而如果函数返回一个引用类型(Object、Array、Function),则new函数返回改引用类型的对象

    function fn()  
    {  
        this.name="吴小小"
        return {};  //或者 rerurn function(){} 或者 return []
    }
    var a = new fn;  
    console.log(a.user); //undefined
    
    function fn()  
    {  
        this.name="吴小小"
        return undefined; //或者 rerurn null
    }
    var a = new fn;  
    console.log(a); //fn {name: "吴小小"}
    

    知识点三 apply call

    apply或者call第一个参数是this作用域的指向,第二个以后指的是参数

    (function(a){
      console.log(this,a)
    }).apply(0,[4,3])
    // Number 4
    
    (function(a){
      console.log(this,a)
    }).apply({},[4,3])
    // {} 4
    
    (function(a){
      console.log(this,a)
    }).apply(null,[4,3])
    // window 4
    
    (function(a){
      console.log(this,a)
    }).apply(undefined,[4,3])
    // window 4
    
  • 相关阅读:
    AJPFX解析成员变量和局部变量
    AJPFX关于Java Object类常用方法小总结
    AJPFX关于面向对象中的对象初始化整理,综合子父类、代码块等等
    AJPFX总结FileWriter类的write方法
    AJPFX总结java创建线程的三种方式及其对比
    java android中日期时间 问题总结
    安卓开发——ListView控件(初始化ListView、列表刷新、长按添加menu)
    android开发分辨率适配总结
    activity生命周期实例(不同启动模式)
    ViewPage最全解析
  • 原文地址:https://www.cnblogs.com/yangwang12345/p/7814803.html
Copyright © 2020-2023  润新知