2015-07-27 39 views
9

Tôi cố gắng để hiểu các chức năng mũi tên trong ECMAScript 6.này giá trị cho các chức năng mũi tên

Đây là định nghĩa tôi đi qua trong khi đọc:

chức năng mũi tên có tiềm ẩn this ràng buộc, có nghĩa là Giá trị của giá trị this bên trong một chức năng mũi tên là aways giống như giá trị this trong phạm vi trong đó chức năng mũi tên được xác định!

Theo định nghĩa, tôi tin rằng this cho một arrow function nên chứa các giá trị mức khối tương tự mà mũi tên hàm được định nghĩa trong

Mã số:.

var test = { 
    id: "123123", 
    k: { 
    laptop: "ramen", 
    testfunc:() => console.log(this) 
    } 
} 

console.log(test.k.testfunc); 

Tuy nhiên, tôi nhận được kết quả này từ mã

function testfunc() { 
    return console.log(undefined); 
} 

Điều tôi nghĩ tôi sẽ g et sẽ là một sản phẩm của:

{"laptop": "ramen"} 

nếu tôi chạy này

console.log(test.k.testfunc());

+0

Khi sử dụng 'console.log (test.k.testfunc());' trong FF (lưu ý dấu ngoặc đơn ở cuối), tôi nhận tham chiếu đến cửa sổ. Đó là chính xác như khi xác định chức năng, phạm vi hiện tại là 'cửa sổ' trong trường hợp của tôi. – Sirko

+0

điều này sẽ giúp giải thích: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions "này". Xem những gì tôi đã làm ở đó? – LDJ

Trả lời

4

Hãy chuyển vào mã ES5 tương đương:

var test = { 
    id: "123123", 
    k: { 
    laptop: "ramen", 
    testfunc: function(){return console.log(this)}.bind(this) 
    } 
} 

Hãy nhớ rằng this phụ thuộc vào cách bạn gọi hàm. Bên ngoài this không nằm trong một hàm, do đó, nó sẽ mặc định là undefined ở chế độ nghiêm ngặt.

Giản kịch bản dưới đây:

console.log(this) // undefined 

var test = { 
    a: this // same `this` as above 
} 
+0

@natebarbettini Các hàm Arrow thừa hưởng 'this' từ phạm vi kèm theo của chúng (phạm vi chức năng), thật thú vị, điều này sẽ làm việc - testfunc: function() {() => {console.log (this)}()} –

2

Bạn đang định chức năng mũi tên trong phạm vi tương tự mà bạn đã định nghĩa var test. Nếu bạn đang xác định test trong phạm vi toàn cục, thì ngữ cảnh của hàm của mũi tên cũng sẽ là phạm vi toàn cục.

Nếu bạn định nghĩa thử nghiệm bên trong một phương thức, hàm mũi tên sẽ chia sẻ ngữ cảnh của phương thức.

function method() { 
    const self = this; 

    const test = { 
    foo:() => console.log(self === this); 
    } 

    test.foo() 
    // console: true 
} 
Các vấn đề liên quan