2013-07-31 29 views
9

tôi viết code như sau,Tôi có thể sử dụng chức năng như một đối tượng bên trong hàm cùng

function Myfunction(){ 
Myfunction.myvar = "somevar"; 
} 

Sau khi tôi thực hiện chức năng, tôi có thể có thể truy cập Myfunction.myvar

Làm thế nào là nó làm việc? Và nếu tôi làm như vậy, vấn đề ẩn trong điều này là gì?

Nếu có vấn đề gì, vui lòng giải thích ngữ cảnh đó.

+0

Có thể trùng lặp [Static các biến trong JavaScript] (http://stackoverflow.com/questions/1535631/static-variables-in-javascript/1535687#1535687) – Givi

+0

trong hàm js cũng là đối tượng để bạn có thể thêm thuộc tính vào nó, –

+1

Hãy xem [ *** jsFiddle ***] (http://jsfiddle.net/GKDev/TdF94/) * có thể đây là những gì bạn muốn biết. * – Givi

Trả lời

5

Làm thế nào là nó làm việc?

Khi bạn khai báo hàm trong ngữ cảnh thực thi, một ràng buộc được thêm vào môi trường biến của ngữ cảnh đó. Khi bạn tham chiếu một số nhận dạng, môi trường biến hiện tại được kiểm tra để xem liệu một ràng buộc có tồn tại cho mã định danh đó hay không.

Nếu không có ràng buộc tồn tại, môi trường biến bên ngoài được chọn, v.v., sao lưu vào phạm vi toàn cục.

Vì vậy:

// OUTER SCOPE 
// Binding exists for 'example' 
function example() { 
    // INNER SCOPE 
    // No binding for 'example' 

    // References 'example' in outer scope 
    example.x = 1; 
} 

gì là vấn đề ẩn trong này?

Không có (nói chung ... mặc dù đó là giải pháp phù hợp với bạn tùy thuộc vào những gì bạn đang cố gắng làm).

Bạn đang tạo tài sản "tĩnh" một cách hiệu quả. Khi các hàm JavaScript là lớp đầu tiên, bạn có thể đặt các thuộc tính trên chúng như bạn làm với bất kỳ đối tượng nào khác.


Lưu ý rằng hành vi này là khác nhau nếu bạn có một tên chức năng biểu, chứ không phải là khai báo hàm:

var x = function example() { 
    // Identifier 'example' is only in scope in here 
}; 
+0

Cảm ơn bạn đã trả lời đơn giản và trực tiếp ... –

6

Vì chức năng không thực thi cho đến khi bạn gọi nó, Myfunction.myvar không được đánh giá ngay lập tức.

Khi bạn gọi nó, định nghĩa chức năng đã được cài đặt là Myfunction, để nó có thể được giải quyết khi bạn gọi nó.

giống như sau sẽ không hoạt động:

var x = { 
     foo: 1, 
     bar: x.foo } // x does not exist yet. 
+0

+1, đơn giản như vậy. Tôi hơi bối rối về những câu trả lời khác. –

+0

Vâng, tôi chấp nhận nó. có vi phạm mã nào không? Điều này có ảnh hưởng đến hiệu suất không? –

+0

Ảnh hưởng đến hiệu suất so với những gì? Không có sự khác biệt để đề cập đến bất kỳ đối tượng nào khác trong phạm vi kèm theo, không quan trọng là bạn đang đề cập đến chính hàm đó hoặc một cái gì đó hoàn toàn không liên quan. – Thilo

0

Trong javascript mỗi chức năng là một đối tượng. Vì vậy, bạn có thể thêm bất kỳ trường tùy chỉnh nào vào nó.

function A() {} 

A.somevar = 'this is custom field'; 

A.prototype.somevar2 = 'this is field in A proto'; 

Vì vậy, khi bạn tạo đối tượng mới với A contructor, nó sẽ lấy các đặc tính từ nguyên mẫu.

var b = new A(); 
alert(b.somevar2); 
2

Một vấn đề bạn có thể nhận được vì Phạm vi, như một ví dụ phức tạp hơn cho thấy:

function Other() { 
    console.log("a) Other.Myvalue",Other.Myvalue); 
    Other.Myvalue=typeof Other.Myvalue==='undefined' ? 0 : Other.Myvalue+1; 
    console.log("b) Other.Myvalue",Other.Myvalue); 
} 
Other(); 
Other(); 

này sẽ dẫn đến

a) Other.Myvalue undefined 
b) Other.Myvalue 0 
a) Other.Myvalue 0 
b) Other.Myvalue 1 

vì vậy bạn thực sự ràng buộc myVar biến của bạn đến đối tượng hàm chính nó là một singleton và tồn tại chỉ một lần (và được tạo ra bởi định nghĩa hàm chính nó trong ngữ cảnh hiện tại có thể là bối cảnh chung), không phải là một cá thể của đối tượng đó. Nhưng nếu bạn chỉ sử dụng các giá trị tĩnh và không cần bất kỳ logic nào, nó giống như dạng chữ, và tôi sẽ không mong đợi bất kỳ vấn đề nào, khác mà dạng thức thuận tiện hơn:

var Other = { 
    Myvalue: "somevalue" 
}; 
+0

Nếu bạn gọi hàm dựng không có toán tử mới, nó sẽ tạo biến toàn cầu có tên 'Myvar', vì điều này sẽ chỉ đối tượng cửa sổ, nhưng ở chế độ nghiêm ngặt, nó sẽ gây ra lỗi, điều này sẽ không được xác định. [xem] (http://jsbin.com/opoker/1/edit) – Givi

+0

Tôi không thể đủ rõ ràng, khối mã thứ hai của tôi var x = Myfunction(); có liên quan đến mã ban đầu từ câu hỏi. Một biến toàn cầu (có nghĩa là trong bối cảnh xung quanh) có tên Myvar sẽ chỉ được tạo nếu hàm sử dụng nó thay vì tên hàm. –

+0

Tôi đã chỉnh sửa câu trả lời chính xác hơn –

Các vấn đề liên quan