2015-12-12 2 views
3

Нет очевидной разницы между arrow function и regular function.Как программно отличить функцию стрелки от регулярной функции?

({}).toString.call(function() {}) 
"[object Function]" 
({}).toString.call(() => {}) 
"[object Function]" 

или

console.dir((function() {})) 
function anonymous() 
    arguments: null 
    caller: null 
    length: 0 
    name: "" 
    prototype: Object 
    __proto__:() 
    <function scope> 
console.dir((() => {})) 
function anonymous() 
    arguments: (...) 
    caller: (...) 
    length: 0 
    name: "" 
    __proto__:() 
    <function scope> 

Поведение двух разных, хотя и существует допустимый прецедент для возможности рассказать обо всех остальных.

Как программно отличить функцию стрелки от регулярной функции?

+0

Так в основном какой-нибудь способ узнать, если анонимная функция или функция стрелка была использована в качестве аргумента? Я бы не подумал, что есть что-то подобное, но, может быть, есть? – adeneo

+0

Ваш ответ, вероятно, находится в этом объекте, поскольку регулярная функция присваивает этот объект самому себе, но функция стрелки назначает этот объект тому, что этот объект находится за пределами функции стрелки. – Binvention

+0

Зачем вам это нужно во время выполнения? «Поведение двух отличается, хотя» --- это одно и то же: они оба принимают аргументы и возвращают результат. – zerkms

ответ

4

Лучшее, что я могу вспомнить, используя toString:

let isArrowFunction; 

isArrowFunction = (fn) => { 
    console.log(fn.toString()); 

    return fn.toString().indexOf('function') !== 0; 
}; 

console.log(isArrowFunction(() => {}) === true); 
console.log(isArrowFunction((foo: string) => {}) === true); 
console.log(isArrowFunction(function() {}) === false); 

См:

(function() {}).toString(); 
"function() {}" 

(() => {}).toString(); 
"() => {}" 
+0

Более полная реализация может быть найдена https: // github. com/gajus/is-arrow-function и https://www.npmjs.com/package/isarrowfunction и альтернативная реализация by @ljharb https://www.npmjs.com/package/is-arrow-function – Gajus

2

Эмм, требования немного странно, но я сделал некоторые тесты и:

typeof (() => {}).prototype === "undefined" 

Является true, а:

typeof (function() {}).prototype === "undefined" 

Является false, так:

function isArrow(x) 
{ 
    return typeof (x.prototype) === "undefined" 
} 

Fiddle здесь: https://jsfiddle.net/87kn67ov/

+0

Я могу повторите это в Chrome, хотя я не понимаю, как это работает, особенно. учитывая, что '(() => {}). Существуют методы вызова' и другие 'Function'. – Gajus

+0

Я не могу сказать, просто свалил несколько анонимных функций и некоторые функции стрелок и проверил различия. Согласно: http://tc39wiki.calculist.org/es6/arrow-functions/. 'Функции стрелок похожи на встроенные функции, в которых отсутствуют .prototype и любой внутренний метод [[Construct]], но это не объясняет, почему анонимная функция имеет .prototype – Jcl

+1

' Object.getPrototypeOf (() => {}) === Function.prototype' обратите внимание, что это правда. – Gajus

Смежные вопросы