箭头函数学习及注意事项

ES6标准新增了一种新的函数:Arrow Function(箭头函数)。
原来写法:

function (x) {
    return x * x;
}

箭头函数写法:

x => x * x

使用ES6箭头函数语法定义函数,将原函数的“function”关键字和函数名都删掉,并使用“=>”连接参数列表和函数体。箭头函数看上去是匿名函数的一种简写,但实际上,箭头函数和匿名函数有个明显的区别:箭头函数内部的this是词法作用域,由上下文确定。(词法作用域就是定义在词法阶段的作用域。换句话说,词法作用域是由你在写代码时将变量和块作用域写在哪里来决定的,因此当词法分析器处理代码时会保持作用域不变 。)箭头函数的this永远指向其父作用域
举个例子来说明箭头函数和原函数的区别:

let obj = {
    birth: 2000,
    getAge: function () {
        let b = this.birth; // 1990
        let fn = function () {
            return new Date().getFullYear() - this.birth; // this指向window或undefined
        };
        return fn();
    }
};
console.log(obj.getAge()) //NaN
var obj = {
    birth: 2000,
    getAge: function () {
        let b = this.birth; // 1990
        let fn = () => new Date().getFullYear() - this.birth; // this指向obj对象
        return fn();
    }
};
console.log(obj.getAge()) //22

示例及注意事项:
1、当函数参数只有一个,括号可以省略;但是没有参数时,括号不可以省略。

// 无参
var fn = function() {}
var fn = () => {} 

// 单个参数
var fn = function(a) {}
var fn = a => {} 

// 多个参数
var fn = function(a, b) {}
var fn = (a, b) => {}

// 可变参数
var fn4 = function(a, b, ...args) {}
var fn4 = (a, b, ...args) => {}

//返回一个对象

2、箭头函数的this永远指向其父作用域,任何方法都改变不了,包括call,apply,bind。
3、箭头函数不能作为构造函数,不能使用new
因为构造函数的this必须是对象实例,而箭头函数的this根据上下文来确定的因此是没有实例的,箭头函数的this指向别处,自相矛盾。
4、箭头函数没有arguments,caller,callee

箭头函数本身没有arguments,如果箭头函数在一个function内部,它会将外部函数的arguments拿过来使用。
箭头函数中要想接收不定参数,应该使用rest参数...解决。

let A = (b)=>{
  console.log(arguments);
}
A(1,2,3);   // Uncaught ReferenceError: arguments is not defined 


let B = (...c) => {
  console.log(c);
}
B(1,2,3);  //  [1,2,3]

5、 箭头函数通过call和apply调用,不会改变this指向,只会传入参数

let obj = {

    a: 10,

    b: function(n) {
        let f = (n) => n + this.a;
        return f(n);
    },

    c: function(n) {
        let f = (n) => n + this.a;
        let m = {
            a: 20
        };
        return f.call(m,n);
    }

};

console.log(obj.b(1));  // 11

console.log(obj.c(1)); // 11

6、 箭头函数没有原型属性

var a = ()=>{
  return 1;
}

function b(){
  return 1;
}

console.log(a.prototype);  // undefined

console.log(b.prototype);   // {constructor: ƒ}

7、箭头函数不能作为Generator函数,不能使用yield关键字
8、箭头函数返回对象时,要加一个小括号

var fn = () => ({ a: 1 }); //正确

var fn = () => { a: 1 };   //错误

9、箭头函数在ES6 class中声明的方法为实例方法,不是原型方法

class S{

    fn(){

    }

}
var a = new S()

var b = new S()

console.log(a.fn === b.fn )//true

class X{

    fn=()=>{

    }

}

var c = new X()

var d = new X()

console.log(c.fn === d.fn )//false

10、多重箭头函数就是一个高阶函数,相当于内嵌函数

var add = x => y => y + x;

function add(x){
  return function(y){
    return y + x;
  };
}
<think>嗯,用户想了解箭头函数的作用和实际应用场景。首先,我得回忆一下箭头函数的基本概念。箭头函数ES6引入的新特性,用更简洁的语法定义函数。那它的主要特点是什么呢?比如,更短的语法、没有自己的this绑定,还有不能作为构造函数使用。这些特点决定了它的适用场景。 然后,用户可能想知道箭头函数和普通函数有什么区别。比如this的处理,箭头函数继承外层作用域的this,而普通函数有自己的this。这点在回调函数中特别有用,可以避免使用bind或者保存this的麻烦。比如在Vue或React中处理事件时,可能更简洁。 接下来是实际应用场景。常见的比如数组方法中的回调,例如map、filter、reduce,用箭头函数更简洁。还有在需要保持this上下文的时候,比如定时器里的回调,或者对象方法中的嵌套函数。另外,箭头函数作为参数传递给高阶函数时,代码更易读。 不过,用户可能也会遇到箭头函数不适用的场景,比如需要动态this的情况,比如事件处理函数或者对象方法。这时候用普通函数可能更合适。所以需要说明箭头函数的优缺点,让用户知道什么时候用,什么时候不用。 还要注意语法上的差异,比如箭头函数不能使用arguments对象,得用rest参数代替。另外,箭头函数没有prototype属性,不能作为构造函数,用new调用会报错。这些限制也需要提到,避免用户误用。 可能用户是刚学习JavaScript的新手,对this的绑定机制不太清楚,所以需要举一些例子来说明箭头函数如何简化代码,尤其是在处理this的时候。例如,在Vue组件的方法里,使用箭头函数可能不需要再写var that = this;这样的代码,直接访问外层的this。 另外,实际应用场景可以多举几个例子,比如在Promise链中,箭头函数可以让代码更连贯,减少嵌套。或者用在函数式编程中,配合高阶函数使用,让代码更简洁。 最后,总结箭头函数的作用:简化代码,自动绑定this,适合需要简洁和保持上下文的场景。同时提醒用户注意它的限制,不能用在所有情况,需要根据具体情况选择。</think>箭头函数(Arrow Function)是ES6引入的一种函数语法,主要作用是简化代码写法并优化`this`绑定机制。以下是其核心作用及典型应用场景: --- ### 一、箭头函数的作用 1. **语法简洁** - 省略`function`关键字和`return`,例如: ```javascript // 普通函数 const sum = function(a, b) { return a + b; }; // 箭头函数 const sum = (a, b) => a + b; ``` 2. **自动绑定外层`this`** - 箭头函数没有自己的`this`,而是继承外层作用域的`this`,避免了传统函数因`this`指向变化导致的错误。 3. **不可作为构造函数** - 无法用`new`调用,避免了误用。 --- ### 二、实际应用场景 #### 1. 简化回调函数 **场景**:数组方法(如`map`、`filter`、`reduce`)的回调。 ```javascript const numbers = [1, 2, 3]; // 普通函数 const squares = numbers.map(function(n) { return n * n; }); // 箭头函数 const squares = numbers.map(n => n * n); ``` #### 2. 保持`this`上下文 **场景**:Vue/React组件方法、事件监听、定时器回调等。 ```javascript // 传统函数需要绑定this function Counter() { this.count = 0; setInterval(function() { this.count++; // 错误:this指向window }.bind(this), 1000); } // 箭头函数自动继承外层this function Counter() { this.count = 0; setInterval(() => { this.count++; // 正确:this指向Counter实例 }, 1000); } ``` #### 3. 简化高阶函数 **场景**:函数作为参数传递时更简洁。 ```javascript // 传统函数 const addThenDouble = (x, y) => { return function(result) { return result * 2; }.bind(null, x + y); }; // 箭头函数 const addThenDouble = (x, y) => result => (x + y) * 2; ``` #### 4. 函数式编程 **场景**:配合`Promise`链式调用。 ```javascript fetch(url) .then(response => response.json()) .then(data => processData(data)) .catch(error => console.error(error)); ``` --- ### 三、注意事项(不适合的场景) 1. **需要动态`this`时**:如对象方法、DOM事件处理函数。 ```javascript const button = document.querySelector('button'); button.addEventListener('click', () => { // 错误:this指向外层(如window),而非按钮元素 console.log(this); }); ``` 2. **需要`arguments`对象时**:箭头函数没有自己的`arguments`,需改用剩余参数(Rest Parameters)。 ```javascript const func = (...args) => console.log(args); ``` --- ### 四、总结 **适用场景**:短小回调、需要固定`this`指向、函数式编程。 **不适用场景**:需要动态`this`、构造函数、依赖`arguments`对象的方法。 合理使用箭头函数可提升代码简洁性和可读性,但需结合具体需求选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值