美文网首页
js中this的指向问题

js中this的指向问题

作者: 郭先生_515 | 来源:发表于2019-04-28 13:00 被阅读0次

this 指的是当前对象。
如果在全局范围内使用 this,则指向当前页面 window;
如果在函数中使用this,则 this 指向什么是根据当前函数在什么对象上调用所决定的,意思就是函数中的 this 是在调用时候决定的,而不是函数定义时。

我们可以使用 call 和 apply 改变函数中 this 的具体指向。

function foo() {
    console.log(this.frute);
}
// 定义一个全局变量,等同于window.frute = "banana";
var frute = "banana";
// 此时相当于 window 调用foo函数,所以foo中的this指向window;
foo();          //   "banana"
window.foo()    //   "banana"
 
var obj = {
    frute : "apple",
    foo : foo    
};
// 此时相当于 obj 调用foo函数,所以foo中的this指向 obj;
obj.foo();  // "apple"

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

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

在JavaScript中,函数也是对象,为函数定义属性,属性也可为函数。

function foo(){
    if(this === window){
         console.log("this is window");
    }   
};
// 函数foo也是对象,可以为对象定义属性,然后属性为函数
foo.boo = function(){
    if(this === foo){
         console.log("this is foo");       
    }else if(this === window){
         console.log("this is window");
    }
};
// 等价于 window.foo();
foo();  // "this is window";
// 可以看到函数中this的指向调用函数的对象
foo.boo();  // "this is foo";
// 可以使用call改变函数中this指向
foo.boo.apply(window); // "this is window";

对象中嵌套函数的this指向,不是当前对象,而是window。

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

有三种方法可以改变 return 函数内部this的指向问题。

  1. bind() 方法
var name = "window";
var obj = {
    name: "obj",
    getName: function(){
        console.log(this.name);
        return function() {
            console.log(this.name);
        }.bind(this);
    }
}
obj.getName()();  // "obj"  "obj"
  1. that
var name = "window";
var obj = {
    name: "obj",
    getName: function(){
        var that = this;
        console.log(this.name);
        return function() {
            console.log(that.name);
        }
    }
}
obj.getName()();  // "obj"  "obj"
  1. ES6的箭头函数
var name = "window";
var obj = {
    name: "obj",
    getName: function(){
        console.log(this.name);
        return () => {
            console.log(this.name);
        }
    }
}
obj.getName()();  // "obj"  "obj"

相关文章

  • JS进阶篇-this指向问题

    JS中this的指向问题不同于其他语言,JS中的this不是指向定义它的位置,而是在哪里调用它就指向哪里。 JS中...

  • js中this指向问题

    this的指向在函数定义的时候是无法确定的,只有函数执行的时候才能确定this到底指向谁,实际this指向是调用他...

  • JS中this指向问题

    首先声明,添加删除线的都是不太确定的 下面我们分情况解释: 1、函数调用模式--当一个函数并非一个对象的属性时,那...

  • js中this指向问题?

    This是一个关键字,它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用。 this 是在函数被调用时确...

  • js中this的指向问题

    this是Javascript语言的一个关键字它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用,下面分...

  • js 中 this 的指向问题

  • JS中的this指向问题

    1. this的几种绑定方法 (1)普通函数中的this指向函数的调用点 (2) call明确绑定 (3)bind...

  • JS 中的 this指向问题

    程序员就是没有人情味的原始人,不懂交际。谈不到对象。每天就是查看a-z,0-9加上!@#¥%…/&()+-=/<>...

  • js中的this指向问题

    只要记住这句话,谁调用的就指向谁,既调用函数所处的父层 window 对象 此时的this=>foo,如果改成这样...

  • JS中的this指向问题

    this是我们日常最经常使用的语法之一。通过这篇文章分析一下this的指向问题。说到this就一分为二来看(ES6...

网友评论

      本文标题:js中this的指向问题

      本文链接:https://www.haomeiwen.com/subject/nkrdnqtx.html