2015-09-15 6 views
0

Как проверить, является ли возвращаемая переменная функцией?JQuery проверить, является ли переменная функцией

var testController = function() { 
 
    alert('123'); 
 
} 
 

 
$(function() { 
 
    $('[mfour]').each(function(e, t) { 
 
    var a = $(t).attr('mfour'); 
 
    console.log($.isFunction(testController)); 
 
    console.log($.isFunction(a)); 
 
    }) 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 

 
<div mfour="testController">asd</div>

Обратите внимание, что на первых console.log возвращает значение TRUE, когда имя функции жестко закодировано в то время как на втором console.log если переменная оценивается возвращает FALSE.

Это странно, потому что var a возвращает testController.

Вот jsFiddle.

Моя цель состоит в том, чтобы запустить определенную базу функций по атрибуту mfour. Таким образом, в приведенном выше примере testController будет запускать функцию testController.

+2

атрибут HTML всегда является строка, а не функция – Tom

+1

'ATTR()' всегда возвращает строку, никогда функции. Тот факт, что это может быть * имя * функции, не имеет значения. –

+0

Я думаю, вы скорее захотите что-то вроде http://stackoverflow.com/q/5848700/218196. –

ответ

1

В вашем примере, чтобы получить ссылку на testFunction, если он находится в области видимости, вы можете использовать eval. Да, я сказал это, eval, поэтому вы должны знать, что пользователь может запускать вредоносный код, если вы не дезинфицируете его для имен функций;

var testController = function() { 
 
    alert('123'); 
 
} 
 

 
$(function() { 
 
    $('[mfour]').each(function(e, t) { 
 
    var a = eval($(t).attr('mfour')); 
 
    console.log($.isFunction(testController)); 
 
    console.log($.isFunction(a)); 
 
    }) 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div mfour="testController">Hello</div>

+0

Это работает !!!!!! – basagabi

2

Попробуйте использовать window[varname] - если функция находится в глобальной области

как этот

DEMO

var testController = function() { 
 
    alert('123'); 
 
} 
 

 
$(function() { 
 
    $('[mfour]').each(function(e, t) { 
 
     var a = $(t).attr('mfour'); 
 
     console.log($.isFunction(testController)); 
 
     console.log($.isFunction(window[a])); 
 
     console.log(typeof window[a] === "function"); 
 
    }) 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<div mfour="testController">Hello</div>

+0

Он не работает ни [link] (http://jsfiddle.net/nqmwjsp2/2/) – basagabi

+1

Как я уже сказал: «Предполагая, что функция находится в глобальной области действия», ваша находится в onload – mplungjan

+0

@ user1781041: Функция в ваш пример не является глобальным. –

1

Чтобы проверить, если переменная является функцией только добавить проверка

typeof variableName 

Он вернет тип переменной.

Чувак ..

Если возможно, добавить функцию к объекту. Как ниже

var obj = { 
    testController: function(){ 
     alert('123'); 
    } 
}; 

    $(function() { 
     $('[mfour]').each(function(e, t) { 
      var a = $(t).attr('mfour'); 
      console.log($.isFunction(obj[a])); 
     }) 
    }); 
+1

Может быть '$ .isFunction (obj [a])'? – starikovs

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