2012-01-19 2 views
8

Giả sử tôi đang thực hiện một số hoạt ảnh với Canvas HTML5. Nếu tôi đang tìm để animate phương pháp của một đối tượng, đó sẽ là một lợi thế, hiệu suất khôn ngoan (giả sử tôi không quan tâm về IE8):setTimeout trên phương pháp đối tượng - ES5 ràng buộc, hoặc đóng cửa?

setTimeout(this.render.bind(this), 15); 

hoặc

var self = this; 
setTimeout(function() { self.render() }, 15); 

trường hợp cụ thể của tôi không phải là đủ mạnh để thực sự tạo sự khác biệt một cách trực quan; Tôi chỉ đang cố gắng tìm ra cách thực hành tốt nhất.

Tôi nghĩ rằng việc tạo một chức năng mới với bind sẽ có ít chi phí hơn là tạo ra một đóng cửa, nhưng tôi muốn hỏi các chuyên gia.

+1

mùi này giống như tối ưu hóa hơn với tôi, sau đó một lần nữa tôi không biết vấn đề của bạn là gì, nhưng tôi nghĩ rằng nó an toàn để nói rằng 75% thời gian này không quan trọng – mkoryak

+0

Cả hai đều tạo ra một đóng cửa, sự khác biệt duy nhất là những gì phạm vi những chức năng này bị ràng buộc trong ... –

+2

@mkoryak - nó chỉ tối ưu hóa quá mức nếu bạn đang làm nhiều việc hơn. Cả hai đều tầm thường để thực hiện, và tôi đã tự hỏi đó là (tiềm năng) nhiều hơn performant. –

Trả lời

5

Câu hỏi về hiệu suất JavaScript rất khó, vì các công cụ khác nhau có các đặc tính hiệu suất rất khác nhau. Tốc độ nhanh trên một động cơ là chậm trên một động cơ khác.

Việc đóng cửa của bạn phải rất nhanh; sau khi tất cả, tất cả các chức năng được đóng cửa và biến self của bạn được định nghĩa trong bối cảnh chứa ngay lập tức (vì vậy không có nhiều tìm kiếm thông qua chuỗi phạm vi cho nó). Nhưng về mặt lý thuyết, một động cơ hỗ trợ các tính năng ES5 có thể tối ưu hóa cách hoạt động của bind, làm cho nó thậm chí còn nhanh hơn (thậm chí không cần tìm kiếm chuỗi phạm vi một).

Có quan trọng không? Không. Tôi sẽ sử dụng những gì có ý nghĩa với bạn. Lưu ý rằng IE8 không phải là trình duyệt duy nhất hiện có mà chưa có các tính năng ES5 (mặc dù bạn luôn có thể sử dụng một trong các shims es5, không giống như một số tính năng ES5, bind có thể được mô phỏng hoàn hảo bằng shims trong mã ES3   — mặc dù để làm điều đó họ phải sử dụng call/apply, có thể chậm hơn so với đóng cửa trên một số động cơ).