Chức năng trong JavaScript là full-fledged đối tượng. Họ cũng, khi được thông qua như là một đối số cho một chức năng khác, không giữ lại phạm vi của họ. Vì vậy, trong đoạn mã sau ...
var obj1 = {
property1: "blah",
method1: function() {
alert(this.property1);
// do stuff
}
};
function func1 (passedFunction) {
passedFunction();
// do other stuff
}
func1(obj1.method1);
... func1
sẽ gọi obj1.method1
, nhưng nó sẽ không alert
giá trị của obj1
's property1
, bởi vì tất cả chúng tôi đã làm là vượt qua các đối tượng chức năng, không phải là ngữ cảnh this
của nó. Đó là nơi call
và apply
đi vào. Chúng cho phép bạn tiêm phạm vi, cho biết hàm ý nghĩa của this
sẽ là gì. Ví dụ sau hoạt động:
var obj1 = {
property1: "blah",
method1: function() {
alert(this.property1);
// do stuff
}
};
function func1 (passedObject, passedFunction) {
passedFunction.call(passedObject);
// do other stuff
}
func1(ob1, obj1.method1);
Bây giờ, chúng tôi đã buộc hay nói một cách rõ ràng những gì obj1.method1
ngữ cảnh của nó sẽ bằng cách gọi call
, và đi qua nó là đối tượng nó để sử dụng như this
.
call
và apply
gần như giống hệt nhau, ngoại trừ cách chúng xử lý các đối số bổ sung cho hàm đang được gọi. Xem các bài viết này trên MDN để biết thêm thông tin: call, apply và Function.
Tất cả điều này đã được nói, bb_graphics_GraphicsContext
là một hàm tạo. (Bạn có thể đoán được điều này.) Bạn gọi nó bằng cách sử dụng từ khóa new
, var obj1 = new bb_graphics_GraphicsContext();
. Khi nó đạt đến dòng 1 của hàm, nó lấy đối tượng this
và gọi hàm dựng chung Object
, tiêm một đối tượng mới this
(trong phương thức khởi tạo bb_graphics_GraphicsContext
) làm this
của hàm tạo Object
. Tôi giả định rằng người viết hàm/constructor này đã làm điều này để đảm bảo rằng đối tượng mới được tạo ra trong bb_graphics_GraphicsContext
đã nhận được tất cả các phương thức cơ sở của cơ sở Object
. Nhưng tôi không biết tại sao điều này là cần thiết, như thể bạn gọi bb_graphics_GraphicsContext
với từ khóa new
, nó sẽ lấy tất cả các thuộc tính này một cách tự nhiên.
Bạn có thể muốn làm rõ rằng bạn đang tự hỏi tại sao một hàm tạo cụ thể (hàm "bb_graphics_GraphicsContext") sẽ làm điều đó với tham chiếu 'this' của chính nó. – Pointy
Nó được coi là nhà xây dựng. Nhưng nếu nó, phải gọi bên ngoài chức năng. – miqbal
Đã thêm bình luận bổ sung vào cuối câu trả lời của tôi để nhận được những gì nó làm, và cung cấp suy nghĩ về lý do tại sao nó được thực hiện. –