it-swarm-vi.tech

Cách nhận biết hàm JavaScript có được xác định không

Làm thế nào để bạn biết nếu một chức năng trong JavaScript được xác định?

Tôi muốn làm một cái gì đó như thế này

function something_cool(text, callback) {
    alert(text);
    if( callback != null ) callback();
}

Nhưng nó mang lại cho tôi một

gọi lại không phải là một chức năng

lỗi khi gọi lại không được xác định.

278
Aaron Lee
typeof callback === "function"
431
Tom Ritter

Tất cả các câu trả lời hiện tại sử dụng một chuỗi ký tự mà tôi không muốn có trong mã của mình nếu có thể - điều này không (và cung cấp ý nghĩa ngữ nghĩa có giá trị, để khởi động):

function isFunction(possibleFunction) {
  return typeof(possibleFunction) === typeof(Function);
}

Cá nhân, tôi cố gắng giảm số lượng chuỗi treo xung quanh trong mã của mình ...


Ngoài ra, trong khi tôi biết rằng typeof là một toán tử và không phải là một hàm, có rất ít tác hại trong việc sử dụng cú pháp làm cho nó xuất hiện như là một toán tử sau.

230
Jason Bunting
if (callback && typeof(callback) == "function")

Lưu ý rằng gọi lại (tự nó) ước tính thành false nếu đó là undefined, null, 0 hoặc false. So sánh với null là quá cụ thể.

15
Robin like the bird

Các phương thức này để biết nếu một hàm được triển khai cũng thất bại nếu biến không được xác định vì vậy chúng tôi đang sử dụng một cái gì đó mạnh hơn để hỗ trợ nhận chuỗi:

function isFunctionDefined(functionName) {
    if(eval("typeof(" + functionName + ") == typeof(Function)")) {
        return true;
    }
}

if (isFunctionDefined('myFunction')) {
    myFunction(foo);
}
7
patriciorocca

Mới sử dụng JavaScript Tôi không chắc hành vi đã thay đổi hay chưa nhưng giải pháp do Jason Bunting (6 năm trước) đưa ra sẽ không hoạt động nếu có thể Không xác định được chức năng.

function isFunction(possibleFunction) {
  return (typeof(possibleFunction) == typeof(Function));
}

Điều này sẽ gây ra lỗi ReferenceError: possibleFunction is not defined khi động cơ cố gắng giải quyết biểu tượng có thể có chức năng (như đã đề cập trong các nhận xét cho câu trả lời của Jason)

Để tránh hành vi này, bạn chỉ có thể chuyển tên của hàm bạn muốn kiểm tra nếu nó tồn tại. Vì thế

var possibleFunction = possibleFunction || {};
if (!isFunction(possibleFunction)) return false;

Điều này đặt một biến là hàm bạn muốn kiểm tra hoặc đối tượng trống nếu nó không được xác định và do đó tránh được các vấn đề được đề cập ở trên.

6
NectarSoft

Thử:

if (typeof(callback) == 'function')
5
bdukes

Tôi có thể làm

try{
    callback();
}catch(e){};

Tôi biết có một câu trả lời được chấp nhận, nhưng không ai đề xuất điều này. Tôi không thực sự chắc chắn nếu điều này phù hợp với mô tả của thành ngữ, nhưng nó hoạt động cho tất cả các trường hợp.

Trong các công cụ JavaScript mới hơn, có thể sử dụng finally.

4
Quentin Engles
if ('function' === typeof callback) ...
4
Andrew Hedges
function something_cool(text, callback){
    alert(text);
    if(typeof(callback)=='function'){ 
        callback(); 
    };
}
3
ConroyP

Thử đi:

callback instanceof Function
2
eWolf

Thử:

if (!(typeof(callback)=='undefined')) {...}
2
Brian

Nếu bạn nhìn vào nguồn của thư viện @Venkat Sudheer Reddy Aedama đã đề cập, gạch dưới, bạn có thể thấy điều này:

_.isFunction = function(obj) {
  return typeof obj == 'function' || false;
};

Đây chỉ là câu trả lời GỢI Ý, GỢI Ý của tôi:>

2
VentyCZ

Nếu bạn sử dụng http://underscorejs.org , bạn có: http://underscorejs.org/#isFunction

_.isFunction(callback);

Tôi đang tìm cách kiểm tra xem hàm jQuery có được xác định không và tôi không tìm thấy nó dễ dàng.

Có lẽ có thể cần nó;)

if(typeof jQuery.fn.datepicker !== "undefined")
1
miguelmpn

Nếu bạn muốn xác định lại các hàm, tốt nhất là sử dụng các biến hàm, được xác định theo thứ tự xuất hiện của chúng, vì các hàm được xác định trên toàn cầu, bất kể chúng xuất hiện ở đâu.

Ví dụ về việc tạo một hàm mới gọi một hàm trước đó có cùng tên:

A=function() {...} // first definition
...
if (typeof A==='function')
   oldA=A;
A=function() {...oldA()...} // new definition
0
David Spector

Đối với các hàm toàn cầu, bạn có thể sử dụng hàm này thay vì eval được đề xuất trong một trong các câu trả lời.

var global = (function (){
    return this;
})();

if (typeof(global.f) != "function")
    global.f = function f1_shim (){
        // commonly used by polyfill libs
    };

Bạn cũng có thể sử dụng global.f instanceof Function, nhưng afaik. giá trị của Function sẽ khác nhau trong các khung khác nhau, do đó, nó sẽ chỉ hoạt động với một ứng dụng khung duy nhất đúng cách. Đó là lý do tại sao chúng tôi thường sử dụng typeof thay thế. Lưu ý rằng trong một số môi trường cũng có thể có sự bất thường với typeof f, ví dụ: bởi MSIE 6-8 một số hàm ví dụ alert có loại "đối tượng".

Bằng các hàm cục bộ, bạn có thể sử dụng một trong câu trả lời được chấp nhận. Bạn có thể kiểm tra xem chức năng là cục bộ hay toàn cầu.

if (typeof(f) == "function")
    if (global.f === f)
        console.log("f is a global function");
    else
        console.log("f is a local function");

Để trả lời câu hỏi, mã ví dụ đang hoạt động với tôi mà không có lỗi trong các trình duyệt mới nhất, vì vậy tôi không chắc vấn đề với nó là gì:

function something_cool(text, callback) {
    alert(text);
    if( callback != null ) callback();
}

Lưu ý: Tôi sẽ sử dụng callback !== undefined thay vì callback != null, nhưng chúng gần như giống nhau.

0
inf3rno

Hầu hết nếu không phải tất cả các câu trả lời trước đều có tác dụng phụ để gọi hàm

ở đây thực hành tốt nhất

bạn có chức năng

function myFunction() {
        var x=1;
    }
//direct way
        if( (typeof window.myFunction)=='function')
            alert('myFunction is function')
        else
            alert('myFunction is not defined');
//byString
        var strFunctionName='myFunction'
        if( (typeof window[strFunctionName])=='function')
            alert(s+' is function');
        else
            alert(s+' is not defined');
0
TexWiller

Nếu callback() bạn đang gọi không chỉ một lần trong một hàm, bạn có thể khởi tạo đối số để sử dụng lại:

callback = (typeof callback === "function") ? callback : function(){};

Ví dụ:

function something_cool(text, callback) {
    // Initialize arguments
    callback = (typeof callback === "function") ? callback : function(){};

    alert(text);

    if (text==='waitAnotherAJAX') {
        anotherAJAX(callback);
    } else {
        callback();
    }
}

Hạn chế là nó sẽ luôn thực thi đối số gọi lại mặc dù nó không được xác định.

0
Nick Tsai