ES6箭头函数中的this绑定问题

关于this指向问题的讨论一直是学习js不可忽视的重要部分,那些一个又一个围绕this挖的笔试坑,仿佛永远也填不完

var obj={

fn:function(){

console.log(this);

}

}

obj.fn();//object

以上这段代码是再浅显不过的this指向问题,也就是谁调用的函数,函数体中的this就指向谁

再看下面这段

var obj={

fn:function(){

setTimeout(function(){

console.log(this);

});

}

}

obj.fn();//window

这次this指向了最外层的window对象,为什么呢,还是那个道理,这次this出现在全局函数setTImeout()中的匿名函数里,并没有某个对象进行显示调用,所以this指向window对象

假如我们在这里使用箭头函数呢

var obj={

fn:function(){

setTimeout(() => {

console.log(this);

});

}

}

obj.fn();//object

this又指向函数的宿主对象了

为了更加清楚的对比一般函数和箭头函数this指向的区别,我们给对象添加变量

var obj={

num:3,

fn:function(){

setTimeout(function(){

console.log(this.num);

});

}

}

obj.fn();//undefined

//............................................................

var obj1={

num:4,

fn:function(){

setTimeout(() => {

console.log(this.num);

});

}

}

obj1.fn();//4

如上代码,在没有使用箭头函数的情况下,this指向了window(匿名函数,没有调用的宿主对象),而window对象并没有num属性(num属性在obj中定义),而在使用箭头函数的情况下,this的指向却对象obj1,自然可以输出obj1中定义的属性num。

接下来看更复杂的情况

多层嵌套的箭头函数

var obj1={

num:4,

fn:function(){

var f=() => { //object,也就是指obj1

console.log(this);

setTimeout(() => {

console.log(this);// //object,也就是指obj1

});

}

f();

}

}

obj1.fn();

假如我们改动两层箭头函数的其中一处,看会出现什么结果

var obj1={

num:4,

fn:function(){

var f=function(){

console.log(this); //window,因为函数f定义后并没有对象调用,this直接绑定到最外层的window对象

setTimeout(() => {

console.log(this);//window,外层this绑定到了window,内层也相当于定义在window层(全局环境)

});

}

f();

}

}

obj1.fn();

好,接下来改变另一处

var obj1={

num:4,

fn:function(){

var f=() => {

console.log(this); //object,f()定义在obj1对象中,this就指向obj1,这就是箭头函数this指向的关键

setTimeout(function() {

console.log(this);//window,非箭头函数的情况下还是要看宿主对象是谁,如果没有被对象调用,函数体中的this就绑定的window上

});

}

f();

}

}

obj1.fn();

总结:

1.箭头函数的this绑定看的是this所在的函数定义在哪个对象下,绑定到哪个对象则this就指向哪个对象

2.如果有对象嵌套的情况,则this绑定到最近的一层对象上

原文地址:https://www.cnblogs.com/dillonmei/p/12578572.html

时间: 2024-07-31 03:12:14

ES6箭头函数中的this绑定问题的相关文章

深入理解ES6箭头函数中的this

简要介绍:箭头函数中的this,指向与一般function定义的函数不同,箭头函数this的定义:箭头函数中的this是在定义函数的时候绑定,而不是在执行函数的时候绑定. (1)一般函数this指向在执行是绑定  当运行obj.say()时候,this指向的是obj这个对象. var x=11; var obj={ x:22, say:function(){ console.log(this.x) } } obj.say(); //console.log输出的是22 (2)所谓的定义时候绑定,就

es6箭头函数 this 指向问题

es5中 this 的指向 var factory = function(){ this.a = 'a'; this.b = 'b'; this.c = { a:'a+', b:function(){return this.a} } }; console.log(new factory().c.b()); // a+ 通过es5的语法调用,返回的是 a+ ,this 的指向是该函数被调用的对象,也就是说函数被调用的时候,这个 this 指向的是谁,哪个对象调用的这个函数,这个 this 就是谁.

ES6 箭头函数this指向

箭头函数有几个使用注意点. (1)函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象. (2)不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误. (3)不可以使用arguments对象,该对象在函数体内不存在.如果要用,可以用Rest参数代替. (4)不可以使用yield命令,因此箭头函数不能用作Generator函数. 上面四点中,第一点尤其值得注意.this对象的指向是可变的,但是在箭头函数中,它是固定的. function foo() { setTi

ES6箭头函数(节选自《ECMAScript 6 入门》)

基本用法 ES6 允许使用"箭头"(=>)定义函数. var f = v => v; 上面的箭头函数等同于: var f = function(v) { return v; }; 如果箭头函数不需要参数或需要多个参数,就使用一个圆括号代表参数部分. var f = () => 5; // 等同于 var f = function () { return 5 }; var sum = (num1, num2) => num1 + num2; // 等同于 var

ES6 — 箭头函数

一 为什么要有箭头函数 我们在日常开发中,可能会需要写类似下面的代码 const Person = { 'name': 'little bear', 'age': 18, 'sayHello': function () { setInterval(function () { console.log('我叫' + this.name + '我今年' + this.age + '岁!') }, 1000) } } Person.sayHello() 上例的输出结果是什么呢?可能对javascript

箭头函数中的this

箭头函数中的this 箭头函数根据外层(函数或者全局)作用域来决定this 这样this就像其他面向对象的语言,在哪里定义就指向哪里 function foo() { return (x) => { console.log(this); } } var obj1 = { x: 1 }; var obj2 = { x: 2 }; var bar = foo.call(obj1); bar(); //=> { x: 1 } bar.call(obj2); //=> { x: 1 } foo(

【转载】ES6——箭头函数

转载自:https://segmentfault.com/a/1190000004470909 侵删! 箭头函数 定义 定义一个箭头函数很简单,基本语法是: ([param] [, param]) => { statements } param => expression param 是参数,根据参数个数不同,分这几种情况:() => { ... } // 零个参数用 () 表示:x => { ... } // 一个参数可以省略 ():(x, y) => { ... } //

JavaScript ES6箭头函数指南

前言 胖箭头函数(Fat arrow functions),又称箭头函数,是一个来自ECMAScript 2015(又称ES6)的全新特性.有传闻说,箭头函数的语法=>,是受到了CoffeeScript 的影响,并且它与CoffeeScript中的=>语法一样,共享this上下文. 箭头函数的产生,主要由两个目的:更简洁的语法和与父作用域共享关键字this.接下来,让我们来看几个详细的例子. 新的函数语法 传统的JavaScript函数语法并没有提供任何的灵活性,每一次你需要定义一个函数时,你

es6箭头函数讲解

es6箭头函数的用法 箭头函数是es6的一种函数的简写方法. 如下: var f = v = > v; //等同于 var f = function(v){ return v; } var sum = (num1,num2) => num1+num2 ; //等同于 var sum = function(num1,num2){ return num1+num2 } [1,2,3].map(function (x) { return x * x; }); // 箭头函数写法 [1,2,3].ma