2012-05-16 5 views
2

Я работаю свой путь через красноречивый Javascript, и я наткнулся на фрагмент кода, который выглядит следующим образом:Javascript анонимная функция варианта использования

function greaterThan(x) { 
    return function(y) { 
    return y > x; 
    }; 
} 

var greaterThanTen = greaterThan(10); 
show(greaterThanTen(9)); 

Есть ли реальная польза случая для определения функции, как это с анонимная функция внутри? Не было бы намного проще сделать это:

function greaterThan(x,y){ 
    return x > y; 
} 

var greaterThanTen = greaterThan(9, 10); 

любые идеи/комментарии/предложения были бы очень полезными.

+0

Эти два варианта делают две разные вещи ... – gdoron

+0

@gdoron Мне кажется, что они делают то же самое по-другому. –

+0

Они делают разные вещи, вероятно, из-за опечатки. Первоначальный результат возвращает y> x, вторичный возвращает x> y. –

ответ

3

This is an example of a "closure". В принципе, вызов greaterThan() дает вам функцию. Эта функция, а не просто простая функция, несет в себе значение x - это похоже на постоянное включение значения x в функцию.

function obj(x) { 

    //"public interface" 
    //only these are exposed (inc and getX). x is private. 
    return { 
     inc: function() { 
      return ++x; 
     }, 
     getX: function() { //a getter function to retrieve private x 
      return x; 
     } 
    } 
} 

//the value 10 is "embedded" to the returned object 
var myobj = obj(10); 

//every call to inc increments that "embedded" value 
console.log(myobj.inc()); //11 
console.log(myobj.inc()); //12 
console.log(myobj.inc()); //13 

//but you can never access the variable of `x` directly without a "getter" 
console.log(myobj.getX());​ 

Закрытие является одной из замечательных особенностей JavaScript. Одно из его больших применений - эмулировать частные переменные.

+0

Спасибо, это было очень полезно. –

0

Если я что-то пропустил, первый код возвращает функцию. Второй возвращает результат.

+0

Это то, что я получаю; Я не знаю, почему вы когда-либо возвращали функцию, когда можете просто вычислить результат, возвращая функцию, как накладные расходы. –

+0

Я набрал огромный комментарий, а затем понял, что остальные 2 ответа на этой странице aleady покрыли его! – CompanyDroneFromSector7G

0

Это не очень хороший вариант использования. Лучшим вариантом использования анонимных функций являются обратные вызовы, например: вы хотите выполнить функцию # 2 после завершения функции №1.

function a(param1, param2, callback) { 
    //work on param1 and param2 here 
    callback.call(); //triggers the callback function 
} 
1

Первый пример, в котором вы комбинируете функции.

Конечно, вы можете писать по-разному, но идея greatThanTen в первом примере - это нечто иное. Например, вы можете передать это фильтр

var a = [ 1 , 10, 100 , 9, 43 ]; 

function greaterThan(x) { 
    return function(y) { 
    return y > x; 
    }; 
} 
var greaterThanTen = greaterThan(10); 
a.filter(greaterThanTen); 

возвращается [100, 43]

Это функциональное программирование. Существует много преимуществ.

+0

А я вижу, поэтому, используя фильтр, он применит внутреннюю функцию к каждому элементу массива. –

+0

, и у вас нет состояния. вы не можете изменить большую функцию ThhanTen для работы как LargeThanOne –