有没有大佬来解决一下this的问题?

William
  • 7
  var x = 20
  function a(y) {
    function get(y) {
      console.log(this);
      return x + y
    }
    var x = 10
    console.log(this);
    return get(y)
  }
  let b={}
  b.a=a
  console.log(a(10));
  console.log(b.a(1));

image.png
能解释一下这个例子的this是指向谁吗,为什么b.a(1)的get()函数指向的是window啊?

回复
阅读 456
4 个回答

谁调用的get函数了,没有谁,b只是调用了函数a,但是函数a里面的get函数不是b调用的

xuiang
  • 1
新手上路,请多包涵

结论:在浏览器中,凡是一个普通函数没有直接以赋值的形式挂载给有this作用域的对象时,打印this一律为window.
你这里写的get函数自始至终没有挂载给任何对象,只是a这个函数你之后挂载给了b对象,但并不意味着你的get函数给了b对象.所以打印都是window

如果函数是在函数内被声明并调用,我发现都是指向window,这个理论是怎么解释我也不清楚,但实践确实是这样的。

你可以试试下面这两个例子

const x = {
   s: function() {
    console.log(this);
    const b = function(){
      console.log(this);
      const c = function() {
        console.log(this);
      }
      c();
    }
    b();
   }
}

x.s();
const a = function() {
    console.log(this);
    const b = function(){
      console.log(this);
      const c = function() {
        console.log(this);
      }
      c();
    }

    b();
}

const x = {s: {}};
x.s.f = a;
x.s.f();

1.this是在函数调用的时候确定的,除了箭头函数,普通函数的this指向它的执行主体(调用者)。

2.严格模式下的this相对于非严格模式下的this的主要区别在于:对于JS代码中没有写执行主体的情况下,非严格模式默认都是window执行的,所以this指向的是window,但是在严格模式下,没有写执行主体,this指向是undefined;

3.此题,都是在非严格模式下,a(10)和get(y)被调用都没有执行主体,所以this指向window。
而b.a(1)的执行主体是b,所以a函数的this指向b

可以参考一下
https://developer.mozilla.org...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏