js中this指向问题

js中this指向问题老生常谈的问题了,在这里说一下我所理解的层面的this。

this 指的是当前对象,如果在全局范围内使用this,则指代当前页面window;如果在函数中使用this,则this指代什么是根据当前函数是在什么对象上调用。我们可以使用call和apply改变函数中this的具体指向。

console.log(this === window)  // true
console.log(window.alert === this.alert)  // true
console.log(this.parseInt("021",10))  // 21
parseInt(string,radix);
// 当只使用一个参数时,我们都知道是将其转为整数;
// radix 取值为 2~36,表示当前数是几进制,并将这个数转成十进制,当不在这个范围时,会输出NaN;                   

函数中的this是在运行时候决定的,而不是函数定义时。

    function foo(){
            console.log(this.fruit);
    }
    // 定义一个全局变量,等同于window.fruit = "banana";
    var fruit = "banana";
    // 此时函数中的this指向window;
    foo();  //   "banana"

    var  o = {
          fruit : "apple",
          foo : foo
    };
    // 此时函数中的this指向o
    o.foo();  // "apple"

全局函数apply和call可以用来改变this的指向,如下:

    function foo(){
            console.log(this.fruit);
    }
    // 定义一个全局变量,等同于window.fruit = "banana";
    var fruit = "banana";

    var  o = {
          fruit : "apple"
    };

    foo.apply(window);  // "banana";
    foo.call(o);  // "apple";

apply和call的唯一区别,就是在传参的时候,apply的参数需要放在一个数组里面,而call不需要;

因为在JavaScript中,函数也是对象,我们看下面这个例子:

 1     function foo(){
 2          if(this === window){
 3              console.log("this is window");
 4         }
 5     };
 6     // 函数foo也是对象,可以为对象定义属性,然后属性为函数
 7     foo.boo = function(){
 8         if(this === foo){
 9              console.log("this is foo");
10         }else if(this === window){
11                 console.log("this is window");
12             }
13     };
14
15     // 等价于 window.foo();
16     foo();  // "this is window";
17     // 可以看到函数中this的指向调用函数的对象
18     foo.boo();  // "this is foo";
19     // 可以使用call改变函数中this指向
20     foo.boo.call(window); // "this is window";

对象中的嵌套函数的this指向不是当前对象,而是window,看如下例子:

    var name = "window.name";
      var obj = {
          name : "obj.name",
          getName:function(){
              console.log(this.name);
              return function(){
                  console.log(this.name);
              }
          }
      }
      obj.getName()();  // "obj.name"  "window.name"

同样是obj调用的getName和getName里面的方法,结果却是不同的值,这就说明嵌套函数中的this已经不指向当前对象了,而指向window。

那么,我们要怎样解决上述问题呢?主要有三种解决办法,如下:

1.使用函数的bind方法,绑定当前this;

 1     var name = "window.name";
 2       var obj = {
 3           name : "obj.name",
 4           getName:function(){
 5               console.log(this.name);
 6               return function(){
 7                   console.log(this.name);
 8               }.bind(this);
 9           }
10       };
11       obj.getName()();  //  "obj.name"  "obj.name"

2.使用变量将上面的this接收一下,然后下面不使用this,使用那个变量;

 1       var name = "window.name";
 2       var that = null;
 3       var obj = {
 4           name : "obj.name",
 5           getName:function(){
 6               that = this;
 7               console.log(this.name);
 8               return function(){
 9                   console.log(that.name);
10               }
11           }
12       }
13       obj.getName()();  //  "obj.name"    "obj.name"

3.使用ES6的箭头函数,可以完美避免此问题;

 1       var name = "window.name";
 2       var obj = {
 3           name : "obj.name",
 4           getName:function(){
 5               console.log(this.name);
 6               return () => {
 7                   console.log(this.name);
 8               }
 9           }
10       }
11       obj.getName()();    //  "obj.name"    "obj.name"

好了,关于js中this的指向问题就介绍到这里啦。如果你学到了记得点赞哟!

时间: 2024-10-11 10:54:39

js中this指向问题的相关文章

JavaScript面向对象(一)——JS OOP基础与JS 中This指向详解

  前  言 JRedu 学过程序语言的都知道,我们的程序语言进化是从"面向机器".到"面向过程".再到"面向对象"一步步的发展而来.类似于汇编语言这样的面向机器的语言,随着时代的发展已经逐渐淘汰:而面向过程的语言也只有C语言老大哥依然坚挺:现在主流的语言(例如Java.C++.PHP等)都是面向对象的语言. 而我们的JavaScript语言,恰恰介于面向过程与面向对象之间,我们称它为"基于对象"的语言.但是,JS中的OOP依

关于js中this指向的理解总结!

关于js中this指向的理解! this是什么?定义:this是包含它的函数作为方法被调用时所属的对象. 首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(虽然在很多情况下那样去理解不会出什么问题,但是实际上那样理解有些准确的),那么接下来我会深入的探讨这个问题. 例子1: function a(){ var user = " 小明"; console.log(this.user);

js中this指向的三种情况

js中this指向的几种情况一.全局作用域或者普通函数自执行中this指向全局对象window //全局作用域 console.log(this);//Window //普通函数 function fn(){ console.log(this); //Window } fn(); //函数加括号调用叫函数自执行,函数自执行时,内部的this指向顶层对象/window 二.事件函数内部的this指向事件源:注意在事件函数中如果包含普通函数,普通函数自执行后,内部this还是指向window //事

关于js中this指向的总结

js中this指向问题一直是个坑,之前一直是懵懵懂懂的,大概知道一点,但一直不知道各种情况下指向有什么区别,今天亲自动手测试了下this的指向. 1.在对象中的this对象中的this指向我们创建的对象,例如: var obj ={ ccc : 1122, ddd : 2233, ded : function(){ console.log(this); } , fff : function(){ console.log(this === obj ); } } obj.ded(); obj.fff

浅谈js中this指向问题

this 指的是当前对象,如果在全局范围内使用this,则指代当前页面window:如果在函数中使用this,则this指代什么是根据当前函数是在什么对象上调用.我们可以使用call和apply改变函数中this的具体指向. console.log(this === window) // true console.log(window.alert === this.alert) // true console.log(this.parseInt("021",10)) // 21 par

关于js中this指向的问题,打印出obj.nm()的值

问题如下: var num = 1; var obj={ num : 8, nm   : (function(){ this.num *=2; return function(){ return this.num *=2; } })() } var dbl = obj.nm; obj.nm(); obj.nm(); obj.nm(); console.log(obj.num);//64 console.log(this.num);//2 解释: 上述问题中其实就是this的指向问题,this指向

JS中this指向问题相关知识点及解析

概括:this指向在函数定义的时候是无法确定的,只有在函数调用执行的时候才能确定this最终指向了谁,this最终指向的是调用它的对象(常见的说法,后面有小小的纠正): 例1: 图中的函数fn1其实是window对象下面的一个方法,相当于window.fn1()调用了这个方法,而name是fn1的私有变量,所以全局下是没有name这个变量的,所以结果如上所示,this最终指向的也是window这个对象. 例2: 此时this指向的是obj对象,因为fn2是通过obj调用的,所以可以理解this最

了解Js中的this指向

Js中的this对象是在运行时基于函数的执行环境绑定的,其中的this指向很不好理解,一不小心就用错了位置;. this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象. 对于this指向的理解,我分以下几种情况来说, this的指向: 1.在全局函数中,this等于window: var name="cyp"; console.log(this); 2.当函数被用作为某个对象的方法调用时,this等于哪个对

转:彻底理解js中this的指向,不必硬背

转:http://www.cnblogs.com/pssp/p/5216085.html 首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然网上大部分的文章都是这样说的,虽然在很多情况下那样去理解不会出什么问题,但是实际上那样理解是不准确的,所以在你理解this的时候会有种琢磨不透的感觉),那么接下来我会深入的探讨这个问题. 为什么要学习this?