zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    spark学习
    推荐系统-摘录
    matplotlib安装问题解决
    秒杀系统分析
    大数据常用启动命令
    推荐系统简介
    java面试-JVM内存结构
    推荐算法-基于内容的推荐
    推荐算法-基于模型的协同过滤
    监督学习之模型评估与选择
  • 原文地址:https://www.cnblogs.com/yangwang12345/p/7814803.html
Copyright © 2011-2022 走看看