精华内容
下载资源
问答
  • this作用域

    2019-08-23 09:47:24
    this对象 指向当前执行代码的环境对象 全局环境 指向全局对象。在浏览器中, window 对象同时也是全局对象 函数(运行内)环境 在函数内部,this 的值取决于被调用的方式。 在严格模式下,如果this没有被执行环境...

    this对象 指向当前执行代码的环境对象

    全局环境

    指向全局对象。在浏览器中, window 对象同时也是全局对象

    函数(运行内)环境

    在函数内部,this 的值取决于被调用的方式。

    1. 在严格模式下,如果this没有被执行环境定义,那它保持为undefined。
    2. 在非严格模式下,默认为全局对象。
    3. call和apply函数,将this值绑定到调用中的特定对象
    4. 箭头函数,this与封闭环境的this保持一致
    5. 对象的方法,当函数作为对象的方法被调用时,它们的this是调用该函数的对象
    6. 作为构造对象,当一个函数用作构造函数时(使用new关键字)
      虽然构造器返回的默认值是this所指的那个对象,但它仍可以手动返回其他的对象(如果返回值不是一个对象,则返回this对象)
    /*
    * 构造函数这样工作:
    *
    * function MyConstructor(){
    *   // 函数实体写在这里
    *   // 根据需要在this上创建属性,然后赋值给它们,比如:
    *   this.fum = "nom";
    *   // 等等...
    *
    *   // 如果函数具有返回对象的return语句,
    *   // 则该对象将是 new 表达式的结果。 
    *   // 否则,表达式的结果是当前绑定到 this 的对象。
    *   //(即通常看到的常见情况)。
    * }
    */
    
    function C(){
     this.a = 37;
    }
    
    var o = new C();
    console.log(o.a); // logs 37
    
    
    function C2(){
     this.a = 37;
     return {a:38};
    }
    
    o = new C2();
    console.log(o.a); // logs 38
    

    构造函数返回的是function或者object,那么new C2()是{a:38}。

    构造函数返回的不是function或者object,new C()返回的是this对象。

    展开全文
  • this 作用域

    2014-12-04 14:57:00
    this 通常是指当前实例对象,每个函数在被调用时,会自动创建2个特殊变量,this和arguments ,他们只活动在函数内部,不会访问外部。 var name = "glob this"; var obj={ name : "obj this", getName : ...

    this 通常是指当前实例对象,每个函数在被调用时,会自动创建2个特殊变量,this和arguments ,他们只活动在函数内部,不会访问外部。

    var name = "glob this";
    
    var obj={
        name : "obj this",
        getName : function(){
            return function(){
                return this.name;
            }
        }
    }
    
    document.writeln(obj.getName()());
    // glob this

    输出结果:glob this

    匿名函数中this访问的是全局对象

    var objs={
        name : "obj this",
        getName : function(){
            var that = this;
            return function(){
                return that.name;
            }
        }
    
    }
    
    document.writeln(objs.getName()());

    输出结果:obj this

    如果想让闭包匿名函数访问当前域下的name 必须将当前域this保存临时变量中,然后在匿名函数中使用这个临时变量。

     

    this 指针是上下文环境的属性,不是某个变量的属性,this不能被赋值,它和进入上下文相关

    function foo(){console.log(this);}
    foo(); //window
    foo.prototype.constructor(); //foo
    new foo(); // foo
    

      

    转载于:https://www.cnblogs.com/lcw5945/p/4142888.html

    展开全文
  • 主要介绍了javascript中的this作用域详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 在一次面试中遇到了这样的一个问题:题目如下请问关于setTimeout中this作用域是怎么样的其实在之前看了大量的关于this 作用域的问题,但是在回答此问题时还是回答得不够清晰,经过下来资料的查到,进行了再次学习...

    在一次面试中遇到了这样的一个问题:

    题目如下

    请问关于setTimeout中this作用域是怎么样的

    其实在之前看了大量的关于this 作用域的问题,但是在回答此问题时还是回答得不够清晰,经过下来资料的查到,进行了再次学习

    我们来看下面的分析

    有一个函数是这样:在setTimeout中正确输出函数testThis中a的值

    function testThis(){

    this.a = 123;

    setTimeout(function(){

    console.log(this.a)

    },1000)

    }

    test()

    在浏览器中运行这个函数我们得到的结果是"undefined"

    原因就是其实在setTimeout和setInterval中的this是指向Window,所以在这个时候的this.a=window.a,然而我们现在的a是指向函数,并不在window下,

    我们可以看看下面的输出结果

    var a = 123;

    setTimeout(function(){

    console.log(this.a)

    },1000)

    上面的输出结果就能够正确的输出a,原因是我们定义了一个全局作用域(显示全局作用域)

    注:在JavaScript中以var定义的是全局作用域叫显示作用域,直接a = 123,为隐式作用域,

    最大的区别就是加var 其实是定义了一个变量,而不加其实定义了一个window的属性,这个时候使用delete是可以删除不加var的,说远了更多的区别请读者自己去网上咨询,

    我们继续转入正题

    上面能正确的输出a但是不是改变了出题者的意愿,出题者明显是在问在函数中的使用,其实通过上面能正确输出的例子,我们已经看出了一些倪端我们只需对this进行定向保存就能解决此问题

    最简单的解决方法,绑定this到一个固定变量

    function test(){

    this.a = 1234555;

    var _this = this;

    setTimeout(function(){

    console.log(_this.a);

    },1000)

    }

    test();

    在看看下面的例子

    function test(){

    this.f = function(){

    console.log(123);

    setTimeout(function(){

    this.f()

    },1000)

    }

    }

    var t = new test();

    t.f()

    按照上面的分析我们输出的肯定是只有一个“123”,setTimeout里面的f()根本就找不到

    解决方法一 固定this

    function test(){

    this.f = function(){

    var _this = this

    console.log(123);

    setTimeout(function(){

    _this.f()

    },1000)

    }

    }

    var t = new test();

    t.f()

    解决方法二:利用函数的Function.prototype.bind 方法

    function test(){

    this.f = function(){

    console.log(123);

    setTimeout(this.f.bind(this),1000)

    }

    }

    var t = new test();

    t.f()

    通过利用闭包call方法

    function test(){

    this.f = function(){

    console.log(123)

    setTimeout(function(a,b){

    return function(){

    b.call(a)

    }

    }(this,this.f),1000)

    }

    }

    var t = new test();

    t.f()

    正确的this指向是解决此问题的关键

    展开全文
  • 学习总结:JavaScript之this作用域前言this作用域1、定义2、this的指向问题 前言 之前一直对js的this作用域处于一个懵懵懂懂的状态,找了个机会看了一些视频跟其他大佬的文章系统的了解补充了一下this作用域知识,...

    学习总结:JavaScript之this作用域

    前言

    之前一直对js的this作用域处于一个懵懵懂懂的状态,找了个机会看了一些视频跟其他大佬的文章系统的了解补充了一下this作用域知识,然后做了一些学习总结,也是第一次写博客,欢迎大佬们交流经验指出不足。

    this作用域

    1、定义

    每一个行为发生的时候,肯定会有一个发生这个行为的主体。这个主体就是this。
    this指代的是当前对象,即正在执行这个(包含this)函数的对象。
    也就是说,谁调用这个函数,this就指向谁。

    往下看例子

    2、this的指向问题

    上面说到 谁调用这个函数,this就指向谁

    被全局对象调用,this指向全局对象(window)

    var value = 'aaa'
    function lx () {
    	let value = 'bbb';
    	console.log(this.value);
    }
    
    lx(); // aaa
          // 等同于window.lx();被window调用,指向window。
    

    在构造函数中,this指向实例
    (ps:构造函数会生成并返回一个新的对象,this就指向那个对象)

    function Lx () {
    	this.value = 'bbb';
    }
    let xx = new Lx(); // this指向new lx(),也就是指向xx
    console.log(xx.value); // bbb
    

    谁调用这个函数,this就指向谁
    下面这个例子就很清晰了,由xx调用,所以this指向xx

    var value = 'aaa'
    let xx = {
      value: 'bbb',
      print: function () {
    	  console.log(this.value);
    	}
    }
    xx.print();// bbb
    

    接下来我们看这个例子

    var value = 'aaa'
      var xx = {
        value: 'bbb',
        print: function () {
          console.log(this.value)
        }
      }
      var jj = {
        value: 'ccc',
        zz: {
          value: 'ddd',
          print: function () {
            console.log(this.value);
          }
        }
      }
      xx.print(); // bbb
      window.xx.print(); // bbb
      jj.zz.print(); // ddd
    

    这个时候出现一个问题
    为什么window.xx.print();没有指向window
    为什么jj.zz.print(); 没有指向jj

    总结下来:
    1、如果一个函数中有this,并且它没有被上一级的对象调用,那么this指向window
    2、如果一个函数中有this,并且它被上一级对象调用,那么this指向上一级对象
    3、如果一个函数中有this,并且包含多个对象,即使它被最外层的对象调用,this也仅指向它的上一级对象。这个跟我们前面说的谁调用这个函数,this就指向谁有些许差异,需要再理解消化。

    我们再看两个例子

    var value = "aaa";
      let xx = {
        value: "bbb",
        print: function () {
        /*
           return function () {
           		console.log(this.value);
           } 
        */
        // 为了方便理解我写成这样
        var jj =  function () {
            console.log(this.value);
          }
          return jj;
        }
      }
      xx.print()(); // aaa
    

    首先,xx.print()是一个函数,执行后返回jj函数,所以xx.print()()等同于jj()等同于window.jj(),所以对象中有2层或以上的方法时,this指向全局对象;

    var xx = {
        value: "aaa",
        jj: {
          value: "bbb",
          print: function () {
            console.log(this); //window
          }
        }
      }
      var zz = xx.jj.print;
      zz();
    

    this永远指向最后调用它的对象,函数print赋值给zz的时候并没有执行,所以this不是指向jj,最终执行的时候是由zz()也就是window.zz(),所以this指向全局对象。

    将上一个例子加工一下,变成一个立即执行函数

    var value = "aaa";
      let xx = {
        value: "bbb",
        print: (function () {
           return function () {
           		console.log(this.value);
           }
        })()
      }
      xx.print(); // bbb
    

    为什么它不像前面那个例子一样指向window呢,作为一个立即执行函数,他已经被调用并且返回函数,这个函数是被xx调用,所以指向了xx。

    说说定时器中的this

      setTimeout(function(){
        console.log(this);
      }, 300)
    

    以这个简单的定时器为例,定时器中的函数会放在全局,被window调用,所以定时器中的this指向全局对象

    再说说箭头函数

      let xx = {
        value: "aaa",
        print: () => {
        	console.log(this.value);
        }
      }
      xx.print(); // undefind
    

    按照很多书籍跟例子的说法,箭头函数没有this,this会指向当前函数的上一层作用域(定义时所处的作用域),所以上述例子指向的是全局对象。

    那么我们把箭头函数放到定时器中

      let xx = {
        value: "aaa",
        print: function () {
          setTimeout(() => {
            console.log(this.value)
          }, 300)
        }
      }
      xx.print(); // aaa
    

    这时候当前函数的上一层作用域是xx,这个this就指向了xx,最简单的判断方法就是当这个箭头函数不存在,那么根据前面的规则,this该指向谁就指向谁。

    关于改变this的指向问题找个时间再继续写,学习借鉴了很多大佬的文档跟视频,做的学习总结,欢迎各位大佬交流指正。

    展开全文
  • 理解this作用域 《javascript高级程序设计》中有说到: this对象是在运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被作为某个对象调用时,this等于那个对象。不过,匿名函数具有全局性,...
  • javaScript中的this作用域  javaScript中的this作用域java的区别是,java中的this是在编译中确定, javaScript中的this是在运行时确定的,不同的调用方式,决定js中的this指向不同的对象。 代码实现:  //...
  • 改变this作用域的常用方法

    千次阅读 2018-07-25 14:56:22
    继上文我们知道this作用域的作用范围,现在我们了解下如何改变this作用域。 改变this作用域常用的有三种方法。如下: 1、通过call()和apply()改变(两种方法) 这两种方法达到的效果都一样,只是用法不一样。 ...
  • 专IE7浏览器,IE URL参数过长问题,引发HTTP Status 122报错;this作用域问题,对应的解决方法如下,感兴趣的朋友可以参考下,希望对大家有所帮助
  • JavaScript之this作用域

    2019-11-27 20:27:06
    this作用域 1.箭头函数 2.立即执行函数 3.对象中的this 4.全局作用域中的this 5.定时器中的this 6.绑定事件中的this 7.构造函数中dethis 8.改变this的指向
  • this作用域问题 一般来说,谁调指谁是一个基本原则,但是这并不是一个非常好的面试回答,虽然从某种程度上,这有助于帮我们判断this指向问题,但是不能涵盖所有的情况,建议从函数调用的4种方式展开 函数式调用 ...
  • js的this作用域

    2014-05-07 09:48:00
    this作用域以前专门学习研究过,但发现依然不够全面和完整。现在继续学习 先列出之前看过的结论: 函数在被调用的时候会意外接受两个参数:this和argument,其中this的值跟取决于函数的调用模式1,方法调用模式 o....
  • TypeScript中有三种声明函数的方法: // 普通函数 function fn1() { console.log("XJL");...现在我们来演示一下,在TypeScript的类的各种情况下this作用域的范围 1.无嵌套类和无嵌套函数的普通类 clas.
  • 实际上个问题的根本原因是函数以及子函数的this作用域范围处理问题 Vue中this作用域说明 参考文章: Vue里this指向 Vue官网对Methods的解析 如何修复Vue中的 “this is undefined” 问题 对于一个...
  • 原文地址:this作用域、javascript面向对象作者:loveflying此过程模拟了javascript操作符new对象的过程。 var name = "zjx"; var say = function (){  alert(this.name);  this.eat = function(){  alert("eat...
  • 1.在全局作用域中,this指向window; 2.在对象中(或者方法调用中),this指向对象(谁调用指向谁); 3.构造函数中,this指向新创建的对象本身 4.在apply和call中,this指向调用者; 5.箭头函数中,this指向外层作用...
  • 一、先说一个简单的概念——变量提升:通过...二、说一个特别重要的概念——函数在定义的时候(不是在调用的时候),就已经确定了函数内部自由变量的作用域;上面的概念对于理解this指向特别重要!!!1.首先看一个例...
  • 前两天接到一个需求,需要在一个弹窗的“确定”按钮上加一个倒计时,试过setInterval,未成功,就想到了用setTimeout,但是其中的this作用域倒是令我困扰了好长时间。 初始大致的结构如下: // 错误代码 fun() { ...
  • 问题 在之前的 VUE 使用一个定义了的属性,一直用的是 this.xxx,而在 uni-app 中使用 this.xxx,却发现无法赋值的问题 uni.login({ provider: 'weixin', ...既然是因为 this 作用域的问题,就要使 this
  • vue this作用域

    千次阅读 2018-09-07 10:25:17
    一、概念: 1、对象:有属性有方法的代码段,能用....this是对象的代表,具体this 代表哪个对象,有个规则说明: 从使用this的地方开始找生命周期钩子,如果能找到直属钩子,并且此钩子属于一个对象,则th...
  • 之前项目中踩过的坑分享一下,项目框架...vue中ajax中this默认指向对象是vue本身,当然你如果想在全局使用就要先把this作用域提升到全局 let that = this; 按正常来讲这时已经用这个that在ajax中取值...
  • this作用域问题

    2018-12-05 16:49:50
    var color="red"; function f() { console.log(this.color) } f(); //red var o={color:'blue'}; //第一种 f.call(o); //bule //第二种 o.sayColor=f; o.sayColor(); //bu...
  • JS中this作用域的问题:常见报错:XXX function 或者变量 未定义 场景:定义了全局的函数,但是使用的时候,报错XXX 函数或者变量未定义,但实际上js中明明已经定义了且正确 问题原因:大多数是因为调用过程中this...
  • js中this作用域

    2021-03-31 11:15:12
    添加链接描述

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,391
精华内容 2,956
关键字:

this作用域