javaScript中this的指向问题

Posted cwxblog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javaScript中this的指向问题相关的知识,希望对你有一定的参考价值。

javascript 有一套完全不同于其它语言的对 this 的处理机制。this的指向不仅是由定义函数的方式和位置决定,同时还严重受到函数调用方式的影响

1. 在全局范围内

this 指向全局对象,浏览器是 window 对象, node 是 global 对象

 

2. 作为函数调用

 在函数内部,this 指向全局对象。

function foo() 
    console.log(this); // window or global

foo();
/*
<ref *1> Object [global] 
  global: [Circular *1],
  clearInterval: [Function: clearInterval],
  clearTimeout: [Function: clearTimeout],
  setInterval: [Function: setInterval],
  setTimeout: [Function: setTimeout] 
    [Symbol(nodejs.util.promisify.custom)]: [Function (anonymous)]
  ,
  queueMicrotask: [Function: queueMicrotask],
  clearImmediate: [Function: clearImmediate],
  setImmediate: [Function: setImmediate] 
    [Symbol(nodejs.util.promisify.custom)]: [Function (anonymous)]
  

*/

3.作为一个方法调用,关联在一个对象上

this指向该方法所在的对象

// 方法调用
let name = 'xyz';
let ninja = 
    name: 'skulk',
    getName: function() 
        console.log(this.name)
    

ninja.getName(); // skulk

4. 作为一个构造函数调用

 在函数内部,this 指向新创建的对象。

//构造函数调用
function Bar(name) 
    this.name = name;
    this.skulk = function() 
        console.log(this)
    

let bar = new Bar('abc');
bar.skulk();
//  name: 'abc', skulk: [Function (anonymous)] 

5.通过apply和call方法调用

当使用 Function.prototype 上的 call 或者 apply 方法时,函数内的 this 将会被 显式设置为函数调用的第一个参数。

// call or apply 调用
function juggle() 
    let result = 0;
    for (let n=0; n<arguments.length; n++) 
        result += arguments[n];
    
    this.results = result;

let ninja1 = ;
let ninja2 = ;
juggle.apply(ninja1, [1,2,3,4]);
juggle.call(ninja2, 5,6,7,8);
console.log(ninja1); //  results: 10 
console.log(ninja2); //  results: 26 


以上是关于javaScript中this的指向问题的主要内容,如果未能解决你的问题,请参考以下文章

this指向全局对象

一文梳理JavaScript中的this

JavaScript call/apply/bind

JavaScript call/apply/bind

JavaScript中this指向

javascript,promise,如何在 then 范围内访问变量 this [重复]