JavaScript'te “=>” (eşittir ve daha büyük olan bir ok) ne anlama gelir?


444

>=Operatörün eşit veya daha fazla anlama geldiğini biliyorum , ancak =>bazı kaynak kodlarında gördüm . Bu operatörün anlamı nedir?

İşte kod:

promiseTargetFile(fpParams, aSkipPrompt, relatedURI).then(aDialogAccepted => {
    if (!aDialogAccepted)
        return;

    saveAsType = fpParams.saveAsType;
    file = fpParams.file;

    continueSave();
}).then(null, Components.utils.reportError);

5
Ok işlevleri ile ilgili bu bağlantıya bakın .
Mistalis

Yanıtlar:


547

Ne olduğunu

Bu bir ok işlevidir. Ok işlevleri, ECMAscript 6 tarafından sunulan ve işlev ifadelerini kullanma yönteminize benzer şekilde kullanılabilen kısa bir sözdizimidir. Başka bir deyişle, bunları genellikle gibi ifadeler yerine kullanabilirsiniz function (foo) {...}. Ancak bazı önemli farklılıkları var. Örneğin, kendi değerlerini bağlamazlar this(tartışma için aşağıya bakın).

Ok işlevleri ECMAscript 6 spesifikasyonunun bir parçasıdır. Henüz tüm tarayıcılarda desteklenmemektedir, ancak Node v. 4.0+ ve 2018 itibariyle kullanımda olan çoğu modern tarayıcıda kısmen veya tamamen desteklenmektedirler . (Aşağıda kısmi bir destek tarayıcı listesi ekledim).

Daha fazla bilgiyi Mozilla ok işlevleri belgelerinde okuyabilirsiniz .

Mozilla belgelerinden:

(Aynı zamanda yağ ok fonksiyonu olarak da bilinir) bir ok işlevi, ifade ile karşılaştırıldığında daha kısa bir söz dizimi olan işlev ifadeleri ve lexically bağlanan thisdeğeri (bağlanmayan kendisine ait this, arguments, superya da new.target). Ok işlevleri her zaman anonimdir. Bu işlev ifadeleri yöntem olmayan işlevler için en uygun yöntemdir ve yapıcı olarak kullanılamazlar.

thisOk Fonksiyonlarında Nasıl Çalışır ?

Bir ok işlevinin en kullanışlı özelliklerinden biri yukarıdaki metne gömülüdür:

Bir ok fonksiyonu ... thisdeğeri lexically bağlar (kendi bağlamaz this...)

Bunun daha basit terimlerle ifade ettiği şey, ok işlevinin thisdeğeri bağlamından koruduğu ve kendine ait olmadığıdır this. Geleneksel fonksiyonu olabilir , kendi bağlamak thiso tanımlanmış ve denir şekline bağlı olarak, değer. Bu, başka bir fonksiyon içindeki bir fonksiyona self = this;erişmek veya bu thisfonksiyondan manipüle etmek için vb. Gibi birçok jimnastik gerektirebilir . Bu konu hakkında daha fazla bilgi için Mozilla belgelerindeki açıklamaya ve örneklere bakın .

Örnek Kod

Örnek (dokümanlardan da):

var a = [
  "We're up all night 'til the sun",
  "We're up all night to get some",
  "We're up all night for good fun",
  "We're up all night to get lucky"
];

// These two assignments are equivalent:

// Old-school:
var a2 = a.map(function(s){ return s.length });

// ECMAscript 6 using arrow functions
var a3 = a.map( s => s.length );

// both a2 and a3 will be equal to [31, 30, 31, 31]

Uyumluluk ile İlgili Notlar

Düğümde ok işlevlerini kullanabilirsiniz, ancak tarayıcı desteği sivilceli.

Bu işlevsellik için tarayıcı desteği biraz iyileşmiştir, ancak yine de çoğu tarayıcı tabanlı kullanım için yeterince yaygın değildir. 12 Aralık 2017 itibarıyla, şu sürümlerde desteklenmektedir:

  • Chrome (s. 45+)
  • Firefox (s.22+)
  • Edge (s. 12+)
  • Opera (s. 32+)
  • Android Tarayıcı (s. 47+)
  • Opera Mobile (s.33+)
  • Android için Chrome (s. 47+)
  • Android için Firefox (s. 44+)
  • Safari (s. 10+)
  • iOS Safari (s. 10.2+)
  • Samsung İnternet (v. 5+)
  • Baidu Tarayıcı (v. 7.12+)

Şu ülkelerde desteklenmez:

  • IE (s. 11'e kadar)
  • Opera Mini (v. 8.0'a kadar)
  • Blackberry Tarayıcısı (s. 10'a kadar)
  • IE Mobile (s. 11'e kadar)
  • Android için UC Tarayıcı (v. 11.4'ten itibaren)
  • QQ (v.1.2'ye kadar)

CanIUse.com'da daha fazla (ve daha güncel) bilgi bulabilirsiniz (bağlantı yok).


3
TypeScript de bunu destekliyor gibi görünüyor.
mtyson

1
Bu bir lambda ifadesi gibi görünüyor, değil mi?
Addem

1
Tarayıcı uyumluluğu açısından bahsetmek istedim ES6 / ES7 ok işlevlerini ve IE11 ile uyumlu olmayan diğer özellikleri kullanıyorum ama ES6'yı ES5'e aktarmak için Gulel veya Webpack'i ES5'e aktarmak için IE11'de çalışıyor. IE11 desteğine ihtiyacınız varsa ve Babil'i kurmanızın sakıncası yoksa bunun için gidin.
mbokil

76

Bu, ECMAScript 2015 spesifikasyonunun bir parçası olan Ok Fonksiyonu olarak bilinir ...

var foo = ['a', 'ab', 'abc'];

var bar = foo.map(f => f.length);

console.log(bar); // 1,2,3

Bir öncekinden daha kısa sözdizimi:

// < ES6:
var foo = ['a', 'ab', 'abc'];

var bar = foo.map(function(f) {
  return f.length;
});
console.log(bar); // 1,2,3

DEMO

Diğer harika şey sözcüksel this ... Genellikle, şöyle bir şey yapardınız:

function Foo() {
  this.name = name;
  this.count = 0;
  this.startCounting();
}

Foo.prototype.startCounting = function() {
  var self = this;
  setInterval(function() {
    // this is the Window, not Foo {}, as you might expect
    console.log(this); // [object Window]
    // that's why we reassign this to self before setInterval()
    console.log(self.count);
    self.count++;
  }, 1000)
}

new Foo();

Ancak bu okla şu şekilde yeniden yazılabilir:

function Foo() {
  this.name = name;
  this.count = 0;
  this.startCounting();
}

Foo.prototype.startCounting = function() {
  setInterval(() => {
    console.log(this); // [object Object]
    console.log(this.count); // 1, 2, 3
    this.count++;
  }, 1000)
}

new Foo();

DEMO

MDN
sözdizimi hakkında daha fazla

Daha fazlası için burada için oldukça iyi bir cevap zaman işlevlerini ok kullanmak.


Bu kullanım Demoların güncellemek için iyi olacağını esfiddle.net olarak es6fiddle.net artık operasyonel
Wavesailor

25

Bu, ECMAScript 6'da sunulan "ok işlevi ifadesi" olacaktır.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/arrow_functions

Tarihsel amaçlar için (wiki sayfası daha sonra değişirse):

Bir ok işlevi ifadesi, işlev ifadelerine kıyasla daha kısa bir sözdizimine sahiptir ve bu değeri sözcüksel olarak bağlar. Ok işlevleri her zaman anonimdir.


1
çoğu okuyucunun detaya inmesine gerek kalmayacak kadar bilgi dahil mi?
djechlin

2
Bağlantı kurduğum wiki, ne olduğunu çok açık bir şekilde anlatıyor: "Bir ok işlevi ifadesi, işlev ifadelerine kıyasla daha kısa bir sözdizimine sahiptir ve bu değeri sözcüksel olarak bağlar. Ok işlevleri her zaman anonimdir."
Kyle Falconer

1
Bunu bir teklif olarak buraya eklemek cevabınıza gerçekten yardımcı olacaktır.
Hanky ​​Panky

22

Bunlar Ok Fonksiyonları

Yağ Ok Fonksiyonları olarak da bilinir . İşlev ifadeleri yazmanın temiz ve özlü bir yoludur, örn.function() {} .

Ok Fonksiyonlar ihtiyacını kaldırabilir function, returnve {}işlevleri tanımlarken. Java veya Python'daki Lambda İfadelerine benzer tek astarlıdırlar.

Parametresiz örnek

const queue = ['Dave', 'Sarah', 'Sharon'];
const nextCustomer = () => queue[0];

console.log(nextCustomer()); // 'Dave'

Aynı Ok İşlevi içinde birden fazla ifade yapılması gerekiyorsa, bu örnekte queue[0]kıvrık parantez içine almanız gerekir {}. Bu durumda, iade ifadesi atlanamaz.

1 parametreli örnek

const queue = ['Dave', 'Sarah', 'Sharon'];
const addCustomer = name => {
  queue.push(name);
};

addCustomer('Toby');

console.log(queue); // ['Dave', 'Sarah', 'Sharon', 'Toby']

{}Yukarıdakilerden çıkartabilirsiniz .

Tek bir parametre olduğunda, parametrenin ()etrafındaki parantezler atlanabilir.

Birden çok parametreli örnek

const addNumbers = (x, y) => x + y

console.log(addNumbers(1, 5)); // 6

Yararlı bir örnek

const fruits = [
    {name: 'Apple', price: 2},
    {name: 'Bananna', price: 3},
    {name: 'Pear', price: 1}
];

Her meyvenin fiyatını tek bir dizide almak isteseydik, ES5'te şunları yapabilirdik:

fruits.map(function(fruit) {
    return fruit.price;
}); // [2, 3, 1]

Yeni Ok Fonksiyonları ile ES6'da, bunu daha kısa hale getirebiliriz:

fruits.map(fruit => fruit.price); // [2, 3, 1]

Ok İşlevleri hakkında ek bilgi burada bulunabilir .

Tarayıcı Uyumluluğu

  • IE: Henüz Desteklenmiyor
  • Kenar: 12+ (Tüm Sürümler)
  • Firefox: 22+
  • Krom: 45+
  • Safari: 10+
  • iOS Safari: 10.2+
  • Android Tarayıcı: 56+

Tarayıcı uyumluluğu hakkında ek güncel bilgileri burada bulabilirsiniz


21

sadece bir lambda'nın harita kullanmadan neler yapabileceğine dair başka bir örnek eklemek için:

a = 10
b = 2

var mixed = (a,b) => a * b; 
// OR
var mixed = (a,b) => { (any logic); return a * b };

console.log(mixed(a,b)) 
// 20

13

Diğerlerinin söylediği gibi, işlevler oluşturmak yeni bir sözdizimidir.

Ancak, bu tür işlevler normal işlevlerden farklıdır:

  • thisDeğeri bağlarlar . Spesifikasyonda açıklandığı gibi ,

    Bir ArrowFunction için yerel bağlantıları tanımlamak değil arguments, super, this, veya new.target. Yapılan herhangi bir referans arguments, super, thisya da new.targetbir mesafede ArrowFunction a lexically kuşatan ortamda bağlanma çözülmesi gerekir. Tipik olarak bu, hemen çevrelenen bir işlevin İşlev Ortamı olacaktır.

    Bir ArrowFunction referanslar içerebilse de super, 4. adımda oluşturulan fonksiyon nesnesi MakeMethod gerçekleştirilerek bir yönteme dönüştürülmez . Bir ArrowFunction referanslar bu super her zaman olmayan bir mesafede bulunur ArrowFunction uygulamak için gerekli durum superile erişilebilir kapsamı işlevi nesnesi tarafından yakalanır ArrowFunction .

  • Bunlar kurucu değillerdir.

    Bu, [[Construct]] dahili yönteminin olmadığı ve dolayısıyla somutlaştırılamadığı, ör.

    var f = a => a;
    f(123);  // 123
    new f(); // TypeError: f is not a constructor

8

Ben okudum, bu bir sembolü Arrow Functions içindeES6

bu

var a2 = a.map(function(s){ return s.length });

kullanarak Arrow Functionyazılabilir

var a3 = a.map( s => s.length );

MDN Dokümanları


6

Arrowfunction ile basit CRUD örneği ekleme

 //Arrow Function
 var customers   = [
   {
     name: 'Dave',
     contact:'9192631770'
   },
   {
     name: 'Sarah',
     contact:'9192631770'
   },
   {
     name: 'Akhil',
     contact:'9928462656' 
   }],

// No Param READ
 getFirstCustomer = () => { 
   console.log(this);
   return customers[0];
 };
  console.log("First Customer "+JSON.stringify(getFirstCustomer())); // 'Dave' 

   //1 Param SEARCH
  getNthCustomer = index=>{
    if( index>customers.length)
    {
     return  "No such thing";
   }
   else{
       return customers[index];
     } 
  };
  console.log("Nth Customer is " +JSON.stringify(getNthCustomer(1))); 

   //2params ADD
  addCustomer = (name, contact)=> customers.push({
     'name': name,
     'contact':contact
    });
  addCustomer('Hitesh','8888813275');
  console.log("Added Customer "+JSON.stringify(customers)); 

  //2 param UPDATE
  updateCustomerName = (index, newName)=>{customers[index].name= newName};
  updateCustomerName(customers.length-1,"HiteshSahu");
  console.log("Updated Customer "+JSON.stringify(customers));

  //1 param DELETE
  removeCustomer = (customerToRemove) => customers.pop(customerToRemove);
  removeCustomer(getFirstCustomer());
  console.log("Removed Customer "+JSON.stringify(customers)); 

4

Diğer cevaplardan memnun kalmadım. 2019/3/13 itibarıyla en çok oy alan cevap aslında yanlış.

Bunun =>anlamı kısa kısa versiyonu, bir fonksiyon yazma ve onu akıma bağlama için bir kısayoldurthis

const foo = a => a * 2;

Etkili bir kısayol

const foo = function(a) { return a * 2; }.bind(this);

Kısaltılmış her şeyi görebilirsiniz. İhtiyacımız yoktu function, ne returnde.bind(this)Parantez veya parantezlere hatta de

Ok işlevinin biraz daha uzun bir örneği

const foo = (width, height) => {
  const area = width * height;
  return area;
};

Eğer işleve birden fazla argüman istiyorsak, parantezlere ihtiyacımız olduğunu ve tek bir ifadeden daha fazlasını yazmak istiyorsak, parantezlere ve açık bir return .

Parçayı anlamak önemlidir .bindve bu büyük bir konudur. thisJavaScript'te ne anlama geldiğiyle ilgilidir.

ALL işlevlerinin örtük bir parametresi vardır this. NasılthisBir işlevi çağırırken ayarlanacağı, bu işlevin nasıl çağrıldığına bağlıdır.

almak

function foo() { console.log(this); }

Eğer normal ararsan

function foo() { console.log(this); }
foo();

this küresel nesne olacak.

Katı moddaysanız

`use strict`;
function foo() { console.log(this); }
foo();

// or

function foo() {
   `use strict`;
   console.log(this);
 }
foo();

Olacak undefined

Sen ayarlayabilirsiniz thiskullanarak doğrudan callveyaapply

function foo(msg) { console.log(msg, this); }

const obj1 = {abc: 123}
const obj2 = {def: 456}

foo.call(obj1, 'hello');  // prints Hello {abc: 123}
foo.apply(obj2, ['hi']);  // prints Hi {def: 456}

thisNokta operatörünü kullanarak örtük olarak da ayarlayabilirsiniz..

function foo(msg) { console.log(msg, this); }
const obj = {
   abc: 123,
   bar: foo,
}
obj.bar('Hola');  // prints Hola {abc:123, bar: f}

Bir işlevi geri arama veya dinleyici olarak kullanmak istediğinizde bir sorun ortaya çıkar. Sınıf oluşturursunuz ve sınıfın bir örneğine erişen geri çağrı olarak bir işlev atamak istersiniz.

class ShowName {
  constructor(name, elem) {
    this.name = name;
    elem.addEventListener('click', function() {
       console.log(this.name);  // won't work
    }); 
  }
}

Yukarıdaki kod çalışmaz, çünkü öğe olayı tetiklediğinde ve işlevi çağırdığında thisdeğer sınıfın örneği olmaz.

Bu sorunu çözmenin yaygın yollarından biri .bind

class ShowName {
  constructor(name, elem) {
    this.name = name;
    elem.addEventListener('click', function() {
       console.log(this.name); 
    }.bind(this); // <=========== ADDED! ===========
  }
}

Çünkü ok sözdizimi yazabildiğimiz şeyi yapıyor

class ShowName {
  constructor(name, elem) {
    this.name = name;
    elem.addEventListener('click',() => {
       console.log(this.name); 
    });
  }
}

bindetkili bir şekilde yeni bir işlev yapar . Eğer bindolmasaydı, temelde böyle bir şey yapabilirdin

function bind(funcitonToBind, valueToUseForThis) {
  return function(...args) {
    functionToBind.call(valueToUseForThis, ...args);
  };
}

Forma operatörü olmayan daha eski JavaScript'te

function bind(funcitonToBind, valueToUseForThis) {
  return function() {
    functionToBind.apply(valueToUseForThis, arguments);
  };
}

Bu kodu anlamak, kapanışların anlaşılmasını gerektirir , ancak kısa sürüm bindher zaman orijinal işlevi thisona bağlı olan değerle çağıran yeni bir işlevdir . ok işlevi aynı şeyi yapar çünkübind(this)


2

Diğer tüm cevapların zaten söylediği gibi, bu ES2015 ok işlevi sözdiziminin bir parçasıdır. Daha spesifik olarak, bir operatör değil, parametreleri gövdeden ayıran bir noktalama işareti simgesi ArrowFunction : ArrowParameters => ConciseBody. Örn (params) => { /* body */ }.


1

ES6 Ok fonksiyonları:

Javascript'te =>ok işlevi ifadesinin sembolüdür. Bir ok işlevi ifadesinin kendi thisbağlaması yoktur ve bu nedenle yapıcı işlevi olarak kullanılamaz. Örneğin:

var words = 'hi from outside object';

let obj = {
  words: 'hi from inside object',
  talk1: () => {console.log(this.words)},
  talk2: function () {console.log(this.words)}
}

obj.talk1();  // doesn't have its own this binding, this === window
obj.talk2();  // does have its own this binding, this is obj

Ok fonksiyonlarını kullanma kuralları:

  • Tam olarak varsa bir argüman sen Tartışmanın parantez atlayabilirsiniz.
  • Bir ifadeyi döndürür ve aynı satırda yaparsanız {}ve returnifadesini atlayabilirsiniz.

Örneğin:

let times2 = val => val * 2;  
// It is on the same line and returns an expression therefore the {} are ommited and the expression returns implictly
// there also is only one argument, therefore the parentheses around the argument are omitted

console.log(times2(3));


1

(=>) Simgesiyle gösterilen ok işlevleri, anonim işlevler ve yöntemler oluşturmanıza yardımcı olur. Bu daha kısa sözdizimine yol açar. Örneğin, iki sayının eklenmesini döndüren basit bir “Ekle” işlevi aşağıdadır.

function Add(num1 , num2 ){
return num1 + num2;
}

Yukarıdaki işlev, aşağıda gösterildiği gibi “Ok” sözdizimi kullanılarak kısalır.

resim açıklamasını buraya girin

Yukarıdaki kod, yukarıdaki şemada gösterildiği gibi iki bölümden oluşur: -

Giriş: - Bu bölüm anonim işlevin giriş parametrelerini belirtir.

Mantık: - Bu bölüm “=>” sembolünden sonra gelir. Bu bölüm gerçek fonksiyonun mantığına sahiptir.

Birçok geliştirici, ok işlevinin sözdizimini daha kısa, daha basit hale getirdiğini ve böylece kodunuzu okunabilir hale getirdiğini düşünmektedir.

Yukarıdaki cümleye inanıyorsanız, size bir efsane olduğunu söyleyeyim. Bir an için düzgün yazılmış bir işlev, bir ok sembolü kullanılarak bir satırda oluşturulan şifreli işlevlerden çok okunabilir olduğunu düşünüyorsanız.

Arrow işlevinin ana kullanımı kodun callers bağlamında çalışmasını sağlamaktır.

Genel bir değişken "bağlamı" tanımlanmış olan aşağıdaki koda bakın, bu genel değişkene, "SomeMethod" adlı diğer yöntemden çağrılan "SomeOtherMethod" fonksiyonu içinde erişilir.

Bu "SomeMethod" yerel "bağlam" değişkenine sahiptir. Şimdi "SomeOtherMethod", "" SomeMethod "dan çağrıldığından" yerel bağlam "görüntülemesini bekliyoruz, ancak" global bağlam "görüntülüyor.

var context = global context”;

function SomeOtherMethod(){
alert(this.context);
}

function SomeMethod(){
this.context = local context”;
SomeOtherMethod();
}

var instance = new SomeMethod();

Ancak, Ok işlevini kullanarak çağrıyı değiştirirseniz "yerel bağlam" görüntülenir.

var context = "global context";

    function SomeMethod(){
        this.context = "local context";
        SomeOtherMethod = () => {
            alert(this.context);
        }
        SomeOtherMethod();
    }
    var instance = new SomeMethod();

Bu bağlantıyı okumanızı tavsiye ederim ( JavaScript'te ok işleviJavascript bağlamının tüm senaryolarını ve arayanların bağlamına hangi senaryolara uyulmadığını açıklayan ) .

Ayrıca , Bağlam terimini gösteren bu youtube videosunda Ok işlevinin javascript ile gösterilmesini de görebilirsiniz .


0

Diğerlerinin de belirttiği gibi, normal (geleneksel) işlevler this, işlev olarak adlandırılan nesneden (örneğin, tıklatılan bir düğme) kullanılır . Bunun yerine, ok işlevlerithis tanımlayan nesneden .

Neredeyse aynı iki işlevi düşünün:

regular = function() {
  ' Identical Part Here;
}


arrow = () => {
  ' Identical Part Here;
}

Aşağıdaki snippet this, her bir işlevi temsil eden arasındaki temel farkı gösterir . Normal fonksiyonu çıkışları [object HTMLButtonElement]ise ok fonksiyonu çıkışları [object Window].

<html>
 <button id="btn1">Regular: `this` comes from "this button"</button>
 <br><br>
 <button id="btn2">Arrow: `this` comes from object that defines the function</button>
 <p id="res"/>

 <script>
  regular = function() {
    document.getElementById("res").innerHTML = this;
  }

  arrow = () => {
    document.getElementById("res").innerHTML = this;
  }

  document.getElementById("btn1").addEventListener("click", regular);
  document.getElementById("btn2").addEventListener("click", arrow);
 </script>
</html>

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.