2015-09-15 2 views
1

В этом примере возврат одной функции передается как возврат другой функции. Я не уверен, что я понимаю необходимость этого. Пример:Есть ли цель вернуть результат функции в пустой функции?

function(){ 
    return function(){ 
     // Check if the page contains the div 
     var node = document.getElementById("sponsored-content"); // use whatever id your block has 
     isInBody = document.body.contains(node); 

     // If true 
     if (isInBody){ 
      dataLayer.push({'event':'spContent-detected'}); 
     } 
    } 
} 

Когда это может выглядеть следующим образом:

function(){ 
     // Check if the page contains the div 
     var node = document.getElementById("sponsored-content"); // use whatever id your block has 
     isInBody = document.body.contains(node); 

     // If true 
     if (isInBody){ 
      dataLayer.push({'event':'spContent-detected'}); 
     } 
    } 

Для лучшего контекста, tag manager guide является источником этой оригинальной части кода. Добавление этого, кажется, останавливает любые другие js для запуска, если условие ложно.

ответ

4

В этом примере возврат одной функции передается как возврат другой функции.

Это не то, что этот код делает. Он возвращает функцию (сам по себе, фактический объект функции), а не результат функции. Ваша внешняя функция не , вызывающая вашей внутренней функцией, это создание и возвращение. Код во внутренней функции не выполняется до тех пор, пока код, получающий ссылку на функцию, которую возвращает внешняя функция, вызывает ее.

Когда это может выглядеть следующим образом

Он не мог, что делает что-то совсем другое. Это сразу же запускает код с момента вызова этой ранее внешней функции. Но первый пример не запускает этот код, просто создавая функцию, которая, если она будет вызвана, запустит ее.

Этот пример может помочь прояснить это:

// A function that creates functions, in this case functions that multiply 
 
// whatever number you give them by the value used when creating the function 
 
function makeMultiplier(mult) { 
 
    return function(arg) { 
 
    return arg * mult; 
 
    }; 
 
} 
 

 
// Make (but don't run!) a function that multiplies by 10 
 
var m1 = makeMultiplier(10); 
 

 
// Run it a couple of times 
 
snippet.log(m1(5)); // 50 
 
snippet.log(m1(7)); // 70 
 

 
// Make (but don't run!) a function that multiplies by 7 
 
var m2 = makeMultiplier(7); 
 

 
// Run it a couple of times 
 
snippet.log(m2(5)); // 35 
 
snippet.log(m2(7)); // 49 
 

 
// Run each of them again, just to show that they aren't inter-related 
 
snippet.log(m1(6)); // 60 
 
snippet.log(m2(6)); // 42
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

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