2011-10-19 36 views
9

Tôi đang cố gắng để vượt qua document.write như một tham chiếu đến một biến:Javascript tiết kiệm document.write trong một biến và gọi nó

Ví dụ:

var f = document.write 

//then 
f('test'); 

Nó hoạt động với cảnh báo. Tại sao nó không hoạt động với document.write?

+1

Nó có thể không hoạt động vì hàm 'write' dự kiến ​​sẽ được thực thi trên ngữ cảnh của' tài liệu' chứ không phải 'cửa sổ'. – Prusse

+1

Bạn có thể '.bind()' nó, nhưng bạn cần một shim cho các trình duyệt cũ hơn, và tôi không biết nó sẽ ảnh hưởng đến hiệu suất như thế nào. 'var f = document.write.bind (tài liệu);' – user113716

Trả lời

7

Ngoài những gì đã nói, Javascript 1.8.5 có một giải pháp tự nhiên cho vấn đề: các bind function

f = document.write.bind(document) 
f("hello") 

Liên kết ở trên cũng chứa mã thi đua cho các trình duyệt không hỗ trợ JS 1.8.5 được nêu ra.

4

Một số chức năng, bao gồm evaldocument.write không thể được sử dụng gián tiếp (ví dụ: bằng cách tham chiếu thông qua các biến).

Nếu bạn vẫn muốn sử dụng document.write sử dụng f, sử dụng:

function f(s){ 
    document.write(s); 
} 
f('test'); 
+1

Có vẻ như bạn đã đúng. Bất kỳ ý tưởng tại sao? – Dennis

+1

@Dennis 'document.write' dường như mất bối cảnh khi hàm được gián tiếp giới thiệu. Khi sử dụng phương thức ['call'] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call), có thể gián tiếp tham chiếu đến' document.write'. Mã: 'var f = document.write; f.call (document, 'test') ' –

+0

Nếu bạn muốn tham chiếu nó theo biến, bạn phải tham chiếu một hàm IE:' var f = function (i) {document.write (i); } ' –

3

Tại sao nó không hoạt động Tôi không thể nói mà không cần nghiên cứu nhiều hơn, nhưng để giải quyết vấn đề của bạn:

var f = function(i) { document.write(i); } 
10

alert không quan tâm những gì this là (alert là toàn cầu) và document.write làm gì (cần phải biết tài liệu nào đang ghi).

Nếu bạn muốn có trình bao bọc, hãy viết chức năng phím tắt.

function f(str) { document.write(str); } 

… và sau đó tự mình bỏ đi và tự mình gọi cho biến số f. Self-describing là một đức hạnh của mã tốt.

+0

Chính xác, bạn sẽ phải gọi 'f 'như thế này:' f.apply (tài liệu, [str]) '... phần nào đánh bại mục đích tôi cho là? Ít nhất bạn vẫn có thể tạo một tham chiếu rút gọn đối tượng 'document'. – Peter

2

Bởi vì nó thua đúng giá trị của this bên trong write chức năng ...

Bạn có thể vượt qua một tham chiếu đến document ...

var f = document; 

f.write("hello"); 

Hoặc quấn nó giống như các giải pháp khác đề nghị.

3

Tôi đoán đó là vì bạn không áp dụng f để tài liệu (nhưng để cửa sổ)

này hoạt động:

var f = document.write; 
f.call(document, "Hello world!!!"); 
2

Một cách kỳ lạ để làm điều này, là:

var f = window.document.write; 
f.call(window.document, "test") 

Hoặc:

var f = document.write; 
f.apply(document, ["test"]); 
1

Cùng một vấn đề như được đăng trong câu hỏi này: Javascript Class Inheritance

Như những người khác đã đề cập bạn đang mất các chức năng ngữ cảnh. Các hàm là các đối tượng giống như bất kỳ thứ gì khác trong javascript.bằng cách gọi var f = document.write bạn đang nhận được một tham chiếu đến hàm, nhưng hàm không có tham chiếu đến tài liệu mà nó cần.

dụ:

// give the window a new funciton 
window.foo = function() { 
    console.log('FOO!); 
} 

// get a reference to this funciton 
var fn = window.foo; 

// call via reference works and outputs 'FOO!!' to the console 
fn(); 

// attach it to your object 
var myObject = {}; 
myObject.Foo = fn; 

// call it it still works 
myObject.Foo(); 

bây giờ nếu chức năng tham chiếu this thì trên không hoạt độngthis dependes vào bối cảnh gọi. Cách để lưu các bối cảnh tại thời điểm này là sử dụng một kết thúc như thế này ...

// remember this is the window context 

var fn = function (s) { 
    document.write(s); 
} 

Lý do mã trên hoạt động là javascript nhìn vào chức năng và không thấy một đối tượng document địa phương để nó đi lên phạm vi và thấy phạm vi bên ngoài (trong trường hợp này là đối tượng window) có một tài liệu và các cuộc gọi viết trên đó. Thực hiện cuộc gọi đến document.write() giống như việc viết window.document.write()

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