标签: arrow-functions

如何在Safari中使用箭头函数运行ES6代码?

出于某种原因,在当前Chrome或Firefox中运行良好的ES6代码无法在Safari中运行 - 例如,箭头功能.据我所知,Safari可以支持ES6.有什么需要做的吗?

例:

var arr = [1,3,5].map((i) => i*i);
console.log(arr);
Run Code Online (Sandbox Code Playgroud)

或者如果它是完整.html文件:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
    </head>
    <body>

        <script>
            "use strict";

            var arr = [1,3,5].map((i) => i*i);
            console.log(arr);

        </script>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

Safari(我使用的是9.0.3)继续给予 SyntaxError: Unexpected token '>'

javascript ecmascript-6 arrow-functions

6
推荐指数
1
解决办法
6049
查看次数

这在箭头函数中是未定义的

我想在我的箭头函数中访问它:

import myObject from '../myObjectPath';
export const myClass = Fluxxor.createStore({
    initialize() {
        this.list = [];
        this.id = null;
    },
    myOutsideFunction(variable1) {
        // here this in NOT undefined
        myObject.getMyList(this.id, (myList) => {
            // here this in undefined
            this.list = myList;
        } 
    });
)};
Run Code Online (Sandbox Code Playgroud)

但是内部的箭头功能在ma回调函数中这是未定义的!!

我正在使用babel来传输代码:

myOutsideFunction: function myOutsideFunction() {
    var _this = this;
    myObject.getMyList(function (myList) {
        _this.list = myList;
    });
},
Run Code Online (Sandbox Code Playgroud)

javascript this undefined arrow-functions

6
推荐指数
1
解决办法
4625
查看次数

.bind()与箭头函数的差异()=> React中的用法

假设我有一个generateList()更新状态并将其映射到onClick 的函数<li>.

<li className="some-classname"}  
    onClick={this.generateList('product')}> Product </li>
Run Code Online (Sandbox Code Playgroud)

有时我会遇到如下错误:

Warning: setState(...): Cannot update during an existing state transition (such as within给予). Render methods should be a pure function of props...

等等.我在网上挖掘了这个问题的答案,并得到了如下答案:

<li className="some-classname"}  
    onClick={this.generateList.bind(this, 'product')}> Product </li>
Run Code Online (Sandbox Code Playgroud)

但我也看到了一个答案(在Github中,但似乎无法找到它)

<li className="some-classname"}  
    onClick={() => this.generateList('product')}> Product </li>
Run Code Online (Sandbox Code Playgroud)

有什么主要区别?哪个更合适,更有效?我们应该使用这样的原因.bind以及() =>将函数映射到onClickReact组件(或者我主要使用它)的属性时是什么原因?

javascript binding reactjs arrow-functions

6
推荐指数
1
解决办法
2179
查看次数

真的被javascript es6 arrow函数的"封闭范围"搞糊涂了

  • 我在网上做了很多研究,阅读了很多帖子,包括MDN等.
  • 我理解,对于传统的定义函数,函数中的"this"由调用/调用它们的对象(以及几种不同的情况,对象文字,新构造函数,事件处理程序等)定义.
  • 我理解对于箭头函数,"this"是通过封闭的上下文/范围而不是通过调用它们的对象来词法定义的(尽管我们可以使用传统定义的函数(比如说A)来包装箭头函数(比方说,B)和因此首先将对象引用传递给A,然后传递给B)

这里有问题:

  1. 究竟什么是封闭的背景?这是进一步复杂的,因为ES6允许{}成为块/范围/上下文.{}作为分隔符足以定义"封闭上下文",或者它必须在函数范围内.

  2. 一个具体的例子:

    let EventEmitter = require('events').EventEmitter; class Person extends EventEmitter { constructor(name) { super(); this.name = name; } } let mary = new Person('mary'); mary.on('speak', (said) => { console.log(${this.name}: ${said}); }); mary.emit('speak', 'you may delay, but time will not');

它只是设置自定义事件,并在触发自定义事件时添加回调函数.为什么这里的箭头功能不起作用?

"mary"是调用"on"函数的对象,该函数应将"on"中的"this"设置为"mary".最重要的是,箭头函数在其参数位置的"on"函数中定义(在词法上足够,对吧?),为什么箭头函数不能从其"封闭的上下文"中得到"this"值,也就是说,这里的"开"功能???

  1. 同样的例子,使用传统的函数定义:

    let EventEmitter = require('events').EventEmitter; class Person extends EventEmitter { constructor(name) { super(); this.name = name; } } let mary = new Person('mary'); mary.on('speak', function(s) { console.log(this); }); mary.emit('speak', 'you may delay, but …

javascript this ecmascript-6 arrow-functions

6
推荐指数
2
解决办法
1428
查看次数

箭头与ES6类中的经典方法

有没有理由编写ES6方法的经典语法?

class MyClass {

    myMethod() {
        this.myVariable++;
    }

}
Run Code Online (Sandbox Code Playgroud)

当我myMethod()在某些事件上使用回调时,我必须写这样的东西(在JSX中):

// Anonymous function.
onClick={() => { this.myMethod(); }}

// Or bind this.
onClick={this.myMethod.bind(this)}
Run Code Online (Sandbox Code Playgroud)

但是如果我将方法声明为箭头函数:

class MyClass {

    myMethod = () => {
        this.myVariable++;
    }

}
Run Code Online (Sandbox Code Playgroud)

我只能写(在JSX中):

onClick={this.myMethod}
Run Code Online (Sandbox Code Playgroud)

javascript jsx ecmascript-6 arrow-functions ecmascript-next

6
推荐指数
1
解决办法
1288
查看次数

使用箭头函数将参数传递给回调函数

我知道这是ES5的一个重复问题,但是我正在寻找ES6箭头功能的语法。我的代码如下。

fetchItems = (callback) => {
    //After ajax success
    callback(response);
}

const myParams = {name:"John"}
this.fetchItems((res) => {
    console.log(res.data);
});
Run Code Online (Sandbox Code Playgroud)

对于上述情况,我想将一些参数(myParams)与函数调用一起传递并进入函数,如何归档该文件,请帮忙。

javascript ecmascript-6 arrow-functions

6
推荐指数
1
解决办法
1万
查看次数

this关键字不适用于箭头功能

我正在学习ES6,我只想将我的ES5知识转换为ES6。

这是我的ES5代码:

function click() {
  this.className += ' grab';
  setTimeout(() => (this.className = 'remove'), 0);
};
Run Code Online (Sandbox Code Playgroud)

这是我的ES6代码:

const click = () => {
  this.className += ' grab';
  setTimeout(() => (this.className = 'remove'), 0);
  console.log('RENDERING');
}
Run Code Online (Sandbox Code Playgroud)

我的问题是this.className + ='抓住'; setTimeout(()=>(this.className ='remove'),0); 没有运行该功能。但是console.log会显示在日志中。

方法不上箭头职能的工作?

javascript function arrow-functions

6
推荐指数
1
解决办法
895
查看次数

javascript 箭头函数:我们可以像 C++ lambda 那样捕获值吗?

定义 C++ lambda https://en.cppreference.com/w/cpp/language/lambda时,有一个捕获块捕获封闭范围内变量的(至少如果变量是通过复制而不是通过捕获)参考)。因此,如果 lambda 使用已捕获的变量并且稍后执行 lambda,则 lambda 内的相应变量将具有定义 lambda 时的值。

使用 JavaScript 箭头函数,我可以引用封闭范围中的变量。但是,当调用箭头函数时,它将使用它现在拥有的变量的值(而不是定义箭头函数时它拥有的值)。

是否存在类似的变量捕获机制,允许使用箭头函数对象存储捕获的变量值?

这是一个 C++ 示例:

// Example program
#include <iostream>
#include <string>
#include <functional>

int main()
{
  std::function<void(int)> byCopyCaptures[5];
  std::function<void(int)> byRefCaptures[5];
  for(int i=0; i<5; i++) {
      // The variable i is captured by copy:
      byCopyCaptures[i] = [i](int j) {std::cout << "capture by copy: i is " << i << " and j is "<< j <<"\n";};
      // The variable i is captured by reference: …
Run Code Online (Sandbox Code Playgroud)

javascript c++ lambda arrow-functions

6
推荐指数
1
解决办法
6875
查看次数

打字稿声明一个通用函数并为其分配一个箭头函数

我正在尝试编写一个模板函数,即一个箭头函数,并将其分配给一个const变量,

这应该是这样的形式 const method: MethodType<T> = <T>(...) => { ... }

但是当我尝试输入变量时它会抱怨method。下面是代码的一个片段:

export type KeyMethod<T> = (data: T) => any;

export interface DiffResult<T> {
    additions: T[];
    updates: T[];
    deletes: T[];
};

export type DiffMethod<T> = (oldState: T[], newState: T[]) => DiffResult<T>;

                     it complains about this template
                                   vvv
export const diffMethod: DiffMethod<T> = <T>(oldState: T[], newState: T[]) => {
    return {
        additions: [],
        updates: [],
        deletes: []
    }
};
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?也许我没有遵循语法,但我还没有找到类似的例子。

typescript arrow-functions

5
推荐指数
1
解决办法
2335
查看次数

如何正确序列化 Javascript 咖喱箭头函数?

const makeIncrementer = s=>a=>a+s
makeIncrementer(10).toString()    // Prints 'a=>a+s'
Run Code Online (Sandbox Code Playgroud)

这将使得无法正确反序列化(我希望有类似的东西a=>a+10。有没有办法做到这一点?

javascript serialization closures currying arrow-functions

5
推荐指数
1
解决办法
445
查看次数