Javascript количество вызова функции

Как проверить количество вызовов функции другой функции в Javascript?

Как бы я проверить, если функция doSomethingElse вызывается n раз ??

test("Testing something", function () < var spy = sinon.spy(doSomethingElse); doSomething(12); equal(spy.callCount, 12, "doSomethingElse is called 12 times"); >); 

Но это, похоже, не работает, потому что вам нужно вызвать шпиона, пока doSomething() вызывает оригинал doSomethingElse() . Как я могу заставить это работать с QUnit / sinon.js?

Может быть, это даже не хорошая идея? Это выходит за рамки «модульного тестирования», потому что вызывается другая функция?

4 ответа

Вы могли бы сделать что-то вроде этого:

Вы не можете шпионить за чем-то другим.

DoSomethingElse не тестируется, когда что-то не тестируется, его необходимо реорганизовать.

Вам либо нужно ввести doSomethingElse в doSomething

pointer=>; function doSomething(n) < for (var i = 0; i < n; i++) < pointer.doSomethingElse(); >> 

Объявите глобальную переменную с именем count и назначьте ее 0

Теперь внутри функции doSomethingElse() увеличивайте ее как count++

Таким образом, всякий раз, когда вы обращаетесь к переменной count , она будет возвращать количество вызовов doSomethingElse() .

window.count = 0; function doSomething(n) < for (var i = 0; i < n; i++) < doSomethingElse(); >> function doSomethingElse() < count++; // do something here >doSomething(22); alert(count);// alerts 22 

Или, что еще лучше, вызывайте count++ всякий раз, когда функция, которую вы хотите проверить, вызывается в коде.

Примечание. Если вы хотите удалить его, просто удалите объявление переменной ( window.count=0; ) и count++

function debugCalls(f) < if (!f.count) f.count = 0; f.count++; >function doSomethingElse() < debugCalls(arguments.callee); // function code. >// usage for(var i = 0; i < 100; i++) doSomethingElse(); alert(doSomethingElse.count); 

Таким образом, вам будет проще отлаживать любую функцию, которую вы хотите, просто вставив debugCalls (arguments.callee) в функцию, которую вы хотите сохранить, сколько раз она была вызвана.

Источник

Как узнать, сколько раз вызывается функция с помощью javascript / jquery?

Возможно, странный вопрос, но здесь он звучит так: у меня есть функция, которую я периодически вызываю, и в этой функции мне нужно знать, в какой итерации я нахожусь, или сколько раз была вызвана эта функция. Упрощенная версия проблемы:

jQuery( document ).ready( function()< setInterval( "myFunction()", 3000 ); >); function myFunction()

Итак, как мне определить X в приведенном выше коде?

6 ответов

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

var myFuncCalls = 0; function myFunction()

Как только ваш код станет немного сложнее (или если вы используете много других библиотек), вы должны, однако, рассмотреть возможность использования области видимости, как показано в других ответах здесь (лучше всего объяснено в by Vilx).

Вам придется использовать закрытие. Обычно вы используете статическую переменную. в Javascript это будет выглядеть примерно так:

jQuery( document ).ready( function()< setInterval( myFunction, 3000 ); >); var myFunction = (function() < var count = 0; return function()< count++ alert( "I have been called " + count + " times"); >>)(); 

Вот еще одно интересное решение, которое не использует внешнюю переменную. Самое приятное в этом то, что вы можете оставить любые ранее существующие функции без изменений и вызывать их, как обычно. Это означает, что если вы пытаетесь «нажать» на функцию в существующей библиотеке, это будет работать очень хорошо для вас. Он добавляет счетчик ненавязчивый и позволяет вам продолжать нормально вызывать существующие функции; даже с аргументами!

// no js library required // pre-existing function var a = function()< console.log("pre-existing function function"); console.log("arguments:", arguments); >; // add counter func var addFnCounter = function(target)< var swap = target; var count = 0; return function()< swap.apply(null, arguments); count++; console.log("func has been called " + count + " times"); console.log("\n"); >; >; // usage a = addFnCounter(a); // call a() as you would normally a(); a(1,2,3); a('hello', 'world'); // using your setInterval example setInterval(a, 3000); 

Выход

pre-existing function function arguments: [] func has been called 1 times pre-existing function function arguments: [1, 2, 3] func has been called 2 times pre-existing function function arguments: ["hello", "world"] func has been called 3 times 

setInterval вывод

pre-existing function function arguments: [] func has been called 4 times pre-existing function function arguments: [] func has been called 5 times pre-existing function function arguments: [] func has been called 6 times 

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

Простая расширенная версия - дайте переменной сумасшедшее имя, которое никто никогда не будет использовать: calledTimesED7E69A7B141457CA8908A612E3D7A3A

Умная версия: добавьте эту переменную к существующей глобальной переменной. Помните - все является объектом в Javascript!

$(function()< setInterval(myFunction, 3000); >); function myFunction() < myFunction.calledTimes++; alert( "I have been called " + myFunction.calledTimes + " times" ); >myFunction.calledTimes = 0; 

Традиционная версия: используйте область видимости, чтобы скрыть эту переменную.

Это скрывает «myFunction», поэтому давайте попробуем еще раз с хитрой областью видимости:

var myFunction = null; (function() < calledTimes = 0; myFunction = function() < calledTimes++; alert( "I have been called " + calledTimes + " times" ); >>)(); $(function () < setInterval(myFunction, 3000); >); 

. и есть множество других способов скрыть эту переменную в области видимости. Просто выберите свой любимый.

Создайте глобальную переменную и инициализируйте нулем. затем увеличивается на единицу, когда вызывается myfunction (). Отобразите эту переменную вместо X .

Статическая переменная чище и не будет загрязнять вашу внешнюю область, по сравнению с замыканием или декоратором, как в других ответах.

var foo = function() < alert( ++foo.count || (foo.count = 1) ); >// test function callTwice(f) < f(); f(); >callTwice(foo) // will alert 1 then 2 
callTwice( function bar()< alert( ++bar.count || (bar.count = 1) ); >); // will alert 1 then 2 

Вторая - это именованная анонимная функция . И обратите внимание на этот синтаксис:

Источник

Подсчет вызовов функций с помощью JavaScript

Например: у меня много функций, и я использую их много раз. Мне нужно считать звонки для каждой функции. Какова лучшая практика, чтобы сделать это?

Сначала я думал, что мне нужны замыкания, но я не могу правильно их реализовать.

4 ответа

В простейшем случае вы можете украсить каждую функцию профилирующей оболочкой:

_calls = <> profile = function(fn) < return function() < _calls[fn.name] = (_calls[fn.name] || 0) + 1; return fn.apply(this, arguments); >> function foo() < bar() bar() >function bar() < >foo = profile(foo) bar = profile(bar) foo() foo() document.write("
" + JSON.stringify(_calls,0,3));

Для серьезной отладки вам лучше использовать специальный профилировщик (обычно расположенный в консоли вашего браузера).

Вы можете попробовать что-то вроде этого:

 var aCalls = 0; var bCalls = 0; function a() < aCalls = aCalls + 1; alert(aCalls); >function b() 
var count = 0; function myfunction() < count++; alert( "Function called " + count); >myfunction(); myfunction(); 

Лучший способ - использовать профилировщик.

В IE: нажмите F12, чтобы открыть инструменты разработчика, затем перейдите на вкладку Profiler и нажмите кнопку воспроизведения. После остановки профилировщика вы получите много информации (количество вызовов для каждой функции, включенное время, исключительное время и т. Д.)

В Chrome: нажмите F12, перейдите в "Профили", "Собрать профиль ЦП JavaScript", хотя количество вызовов не будет указываться.

Источник

Как узнать, сколько раз функция вызывается с помощью javascript/jquery?

Возможно, странный вопрос, но здесь он идет: у меня есть функция, которую я вызываю периодически и внутри этой функции мне нужно знать, в какую итерацию я вхожу, или сколько раз функция вызывалась. Упрощенная версия проблемы:

jQuery( document ).ready( function()< setInterval( "myFunction()", 3000 ); >); function myFunction()

Итак, как я могу определить X в приведенном выше коде?

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

var myFuncCalls = 0; function myFunction()

Как только ваш код становится немного сложнее (или если вы используете много других библиотек), вы должны, однако, рассмотреть возможность использования области видимости, как показано в других ответах здесь (лучше всего объясняется в один по Vilx).

Простая версия: сделайте глобальную переменную, как в nyarlathotep answer. Проблема – если какой-либо другой код также определяет глобальную переменную с тем же именем, вы оба в беде.

Простая расширенная версия – дать переменной сумасшедшее имя, которое никто никогда не будет использовать: calledTimesED7E69A7B141457CA8908A612E3D7A3A

Умная версия: добавьте эту переменную в существующую глобальную переменную. Помните – все объект в Javascript!

$(function()< setInterval(myFunction, 3000); >); function myFunction() < myFunction.calledTimes++; alert( "I have been called " + myFunction.calledTimes + " times" ); >myFunction.calledTimes = 0; 

Традиционная версия: используйте область видимости, чтобы скрыть эту переменную.

Это скрывает “myFunction”, поэтому давайте попробуем снова с хитроумным видом:

var myFunction = null; (function() < calledTimes = 0; myFunction = function() < calledTimes++; alert( "I have been called " + calledTimes + " times" ); >>)(); $(function () < setInterval(myFunction, 3000); >); 

… и есть еще два миллиона способов скрыть эту переменную с областью видимости. Просто выберите свой любимый.

Вам нужно будет использовать закрытие.
Обычно вы должны использовать статическую переменную. в Javascript это будет выглядеть примерно так:

jQuery( document ).ready( function()< setInterval( myFunction, 3000 ); >); var myFunction = (function() < var count = 0; return function()< count++ alert( "I have been called " + count + " times"); >>)(); 

Вот еще одно интересное решение, которое не использует внешнюю переменную. Лучшая часть этого – вы можете оставить любые ранее существовавшие функции нетронутыми и назвать их так, как обычно. Это означает, что если вы пытаетесь “подключиться” к функции в существующей библиотеке, это будет очень хорошо работать для вас. Он добавляет счетчик ненавязчивый и позволяет вам продолжать нормально звонить на существующие функции; даже с аргументами!

// no js library required // pre-existing function var a = function()< console.log("pre-existing function function"); console.log("arguments:", arguments); >; // add counter func var addFnCounter = function(target)< var swap = target; var count = 0; return function()< swap.apply(null, arguments); count++; console.log("func has been called " + count + " times"); console.log("\n"); >; >; // usage a = addFnCounter(a); // call a() as you would normally a(); a(1,2,3); a('hello', 'world'); // using your setInterval example setInterval(a, 3000); 

Выход

pre-existing function function arguments: [] func has been called 1 times pre-existing function function arguments: [1, 2, 3] func has been called 2 times pre-existing function function arguments: ["hello", "world"] func has been called 3 times 

setInterval вывод

pre-existing function function arguments: [] func has been called 4 times pre-existing function function arguments: [] func has been called 5 times pre-existing function function arguments: [] func has been called 6 times 

Создайте глобальную переменную и инициализируйте ее нулем. затем увеличивайте на единицу при вызове функции myfunction(). Отобразите эту переменную вместо X.

Статическая переменная чиста, и она не будет загрязнять ваш внешний масштаб, по сравнению с закрытием или декоратором, как в других ответах.

var foo = function() < alert( ++foo.count || (foo.count = 1) ); >// test function callTwice(f) < f(); f(); >callTwice(foo) // will alert 1 then 2 
callTwice( function bar()< alert( ++bar.count || (bar.count = 1) ); >); // will alert 1 then 2 

вторая – анонимная функция. И обратите внимание на этот синтаксис:

Источник

Подсчет вызовов функций с помощью JavaScript

Например: у меня много функций и много раз их использую. Мне нужно подсчитывать вызовы для каждой функции. Какова наилучшая практика? Сначала я думал, что мне нужно закрытие, но я не могу реализовать его правильно.

4 ответа

В простейшем случае вы можете украсить каждую функцию с помощью обертки профилирования:

_calls = <> profile = function(fn) < return function() < _calls[fn.name] = (_calls[fn.name] || 0) + 1; return fn.apply(this, arguments); >> function foo() < bar() bar() >function bar() < >foo = profile(foo) bar = profile(bar) foo() foo() document.write("
" + JSON.stringify(_calls,0,3));

Для серьезной отладки вам может быть лучше со специальным профилировщиком (обычно расположенным в консоли браузера).

Лучший способ - использовать профилировщик.

В IE: нажмите F12, чтобы открыть инструменты разработчика, затем перейдите на вкладку "Профайлер" и нажмите кнопку воспроизведения. После остановки профилировщика вам будет предоставлено много информации (количество вызовов для каждой функции, включая время, эксклюзивное время и т.д.).

В Chrome: нажмите F12, перейдите в раздел "Профили", выберите "Профиль процессора JavaScript" (который не укажет вам количество вызовов)

Вы можете попробовать что-то вроде этого:

 var aCalls = 0; var bCalls = 0; function a() < aCalls = aCalls + 1; alert(aCalls); >function b() 

Этот ответ не полностью отвечает требованию вопроса. Почему есть две переменные, а вы храните их только в переменных, а не отображаете их.

Источник

Читайте также:  Html knowledge base template
Оцените статью