2011-09-21 34 views
40

Có cách nào trong Javascript để xác định hàm và gọi ngay lập tức theo cách cho phép nó được sử dụng lại không?Xác định và gọi hàm theo một bước

Tôi biết bạn có thể làm một lần chức năng ẩn danh:

(function(i) { 
    var product = i * i; 
    console.log(product); 
    // Can't recurse here because there's no (ECMA standard) way for the 
    // function to refer to itself 
}(2)); // logs 4 

Hoặc bạn có thể đặt tên cho một chức năng sau đó gọi nó là sau đó:

function powers(i) { 
    var product = i * i; 
    console.log(i * i); 
    if (product < 1e6) { powers(product) }; 
} 

powers(2); // Logs 4, 16, 256... 

Nhưng có một cách sạch xác định và gọi một chức năng trong một lần? Sắp xếp giống như lai của cả hai ví dụ? Không thể làm điều này không ngăn cản tôi làm bất cứ điều gì, nhưng nó cảm thấy nó sẽ là một cách diễn cảm tốt đẹp để viết các chức năng đệ quy hoặc chức năng cần chạy trên $(document).ready() nhưng cũng sau này khi các tình huống thay đổi, vv

+0

Có thể trùng lặp [Tôi có thể đặt tên hàm javascript và thực hiện ngay lập tức không?] (Http://stackoverflow.com/questions/6404196/can-i-name-a-javascript-function-and-execute -it-ngay lập tức) – brichins

Trả lời

43

Bạn có thể thử:

(window.powers = function(i) { 
 
    /*Code here*/ 
 
    alert('test : ' + i); 
 
})(2);
<a href="#" onclick="powers(654)">Click</a>

liên kết làm việc: http://jsfiddle.net/SqBp8/

Nó được gọi khi đang tải và tôi đã thêm nó vào một số anchor tag để thay đổi tham số và alert.

+3

Giải pháp thông minh! Hoạt động mà không có 'window.' là tốt, nhưng rõ ràng ngụ ý globals là ác ... – quis

+1

Chỉ cần thêm một' var quyền hạn; 'trước khi thực hiện ngay lập tức chức năng và bạn tốt để đi. –

23

Nếu tất cả các bạn muốn là truy cập vào các chức năng trong cơ thể của riêng mình, bạn chỉ có thể chỉ định một tên sau từ khóa function:

> (function fac (n) { 
    return (n === 0 ? 1 : n*fac(n-1)); 
    })(10) 
3628800 

Đây là một tính năng tiêu chuẩn (xem ECMA-262, ed 5.1, p.. 98).

+3

Điều này rất thanh lịch cho những gì nó làm. – quis

8

Tất cả các câu trả lời ở đây gần với những gì bạn muốn, nhưng có một vài vấn đề (thêm nó vào phạm vi toàn cầu, không thực sự gọi nó, v.v.). Này kết hợp một vài ví dụ trên trang này (mặc dù nó không may đòi hỏi bạn phải nhớ arguments.callee):

var test = (function() { 
    alert('hi'); 
    return arguments.callee; 
})(); 

Sau đó, bạn có thể gọi nó là:

test(); 
+2

Vấn đề duy nhất là arguments.callee không được chấp nhận (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions_and_function_scope/arguments/callee) và ném một lỗi lên ES5 một cách nghiêm ngặt chế độ. – Tivie

+2

@Tivie Nhưng bạn có thể đặt tên cho hàm ẩn danh. 'var test = (hàm fn() {alert ('hi'); return fn;})();' –

4

Nếu bạn không quan tâm đến giá trị trả về , bạn có thể làm được việc này.

var powers = function powers(i) { 
    var product = i * i; 
    console.log(i * i); 
    if (product < 1e6) { powers(product) }; 
    return powers; 
}(2); 
Các vấn đề liên quan