2015-08-24 14 views
5
var example = function() { 
    console.log(typeof this); 
    return this; 
}; 

Trong chế độ nghiêm ngặt: example.call('test') # prints 'string'Function.prototype.call thay đổi typeof này, bên ngoài chế độ nghiêm ngặt; tại sao?

Nếu không, example.call('test') # prints 'object'

Tuy nhiên, console.log(example.call('test')) in test (như bạn mong muốn)

Tại sao Function.call thay đổi typeof 'test' === 'string' ràng buộc để this bên example?

+2

Nó không phải 'call' rằng những thay đổi bất cứ điều gì. Đó là chế độ sloppy ép buộc giá trị 'this' này thành một đối tượng (ở đây, một đối tượng' String'). – Bergi

Trả lời

5

Khi sử dụng call() và thiết lập this luận đến một giá trị nguyên thủy, rằng giá trị nguyên thủy luôn được chuyển đổi sang một đối tượng, vì vậy bạn sẽ có được các đối tượng chuỗi thay vì chuỗi nguyên thủy

String {0: "t", 1: "e", 2: "s", 3: "t", length: 4, ... 

Các tài liệu cho call() trên MDN bang mà

thisArg
Giá trị của this được cung cấp cho cuộc gọi đến hàm.
Lưu ý rằng đây có thể không phải là giá trị thực của phương thức: nếu phương thức là hàm trong mã chế độ không nghiêm ngặt, nullundefined sẽ được thay thế bằng đối tượng chung, và giá trị nguyên thủy sẽ được chuyển đổi thành đối tượng.

Vì vậy, trong chế độ không nghiêm ngặt các chuỗi giá trị nguyên thủy được chuyển đến một đối tượng, điều này cũng được quy định trong chế độ hạn chế nghiêm ngặt ECMA standard, Annex C

và ngoại lệ
Nếu this là được đánh giá trong mã chế độ nghiêm ngặt, sau đó giá trị this là không bị ép buộc đối tượng.
Giá trị này là null hoặc undefined không được chuyển đổi thành đối tượng chung và giá trị nguyên thủy không được chuyển đổi thành đối tượng bao bọc.
Các this giá trị thông qua thông qua một cuộc gọi chức năng (bao gồm cả các cuộc gọi sử dụng Function.prototype.applyFunction.prototype.call) không cưỡng chế thông qua this giá trị cho một đối tượng

+0

Không chỉ trích bài đăng của bạn mà còn là "đóng hộp"? Tại sao mọi người không cần thiết đưa ra những biệt ngữ vô nghĩa khi spec nói rằng "gắn chặt với một đối tượng" mạch lạc hơn nhiều? – RobG

+0

@RobG - Ai biết được, đó là sao chép/dán trực tiếp từ MDN, sử dụng "đóng hộp", vì vậy tôi tiếp tục sử dụng thuật ngữ đó. – adeneo

+1

Nó không nói "đóng hộp" nữa. ;-) – RobG

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