Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

箭头函数:this 指向 #9

Open
MAYDAY1993 opened this issue Jun 28, 2017 · 5 comments
Open

箭头函数:this 指向 #9

MAYDAY1993 opened this issue Jun 28, 2017 · 5 comments
Labels

Comments

@MAYDAY1993
Copy link
Owner

之前一直不懂 今天又撸了一遍 this 又碰到就不能懒惰了

现在假设你已经知道以下几点:

  • 词法作用域
  • js 中 this 的指向 很多情况 ☝️? 👇? 👈? 👉?
  • 箭头函数写法

好 知道这几点之后 我先总结下:

  • 引用 《you don't know js》:根据外层(函数或全局)作用域来决定 this
  • 箭头函数没有自己的 this 你也别管有没有 就按词法作用域看 所以箭头函数的 this 也没什么特别的

举几个 🌰:

image

上图,箭头函数的 this 指向 foo 的 this 那 foo 的 this 指向哪儿呢 看调用位置 这里指向 obj 所以箭头函数的 this 也指向 obj

2.在箭头函数出现之前 一种 hack 方法是用 self/_self/that 来绑定 this 有了箭头函数 这种写法就不需要惹:

image

3.由于已经按照词法作用域绑定了 再使用 call/apply/bind 传的第一个参数并不改变 this 指向 因此可忽略
所以下图中的还是 -18 :

image

参考资料(建议按先后顺序看)

言必有疏 欢迎指教

@libin1991
Copy link

毫无尿点
`
function A(){
setTimeout(function(){
console.log(this.a)
}.bind(this),2000)
}

var obj={
"a":12345
}

A.call(obj)
`

@wangchunxue
Copy link

还是不懂

@5201314999
Copy link

毫无亮点,只是几个demo 而已,建议看《你不知道的js,上部分》

@jackiewillen
Copy link

写的东西自己能理清逻辑想表达什么吗?

@yukap6
Copy link

yukap6 commented Jul 2, 2019

建议看一下这里的示例

// 创建一个含有bar方法的obj对象,
// bar返回一个函数,
// 这个函数返回this,
// 这个返回的函数是以箭头函数创建的,
// 所以它的this被永久绑定到了它外层函数的this。
// bar的值可以在调用中设置,这反过来又设置了返回函数的值。
var obj = {
  bar: function() {
    var x = (() => this);
    return x;
  }
};

// 作为obj对象的一个方法来调用bar,把它的this绑定到obj。
// 将返回的函数的引用赋值给fn。
var fn = obj.bar();

// 直接调用fn而不设置this,
// 通常(即不使用箭头函数的情况)默认为全局对象
// 若在严格模式则为undefined
console.log(fn() === obj); // true

// 但是注意,如果你只是引用obj的方法,
// 而没有调用它
var fn2 = obj.bar;
// 那么调用箭头函数后,this指向window,因为它从 bar 继承了this。
console.log(fn2()() == window); // true

为什么 fn2()() == window ?而 fn() === obj ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

6 participants