2012-12-04 80 views
2

this link,Mozilla的解釋了通過以下方式「這個」引用:這和詞彙範圍

在一般情況下,在當前範圍內綁定到this對象是 當前函數是怎麼被調用確定,在執行期間不能通過 賦值進行設置,並且每次調用 函數時它都可能不同。

在正常情況下,我瞭解this以及它的引用如何變化。

書臨的JavaScript設計模式說,有關詞彙範圍

的JavaScript也是詞法範圍,這意味着功能 運行它們所定義的範圍,不是它們被執行 範圍以下英寸

所以'這'取決於如何調用當前函數,而詞法作用域意味着函數在它們被定義的範圍內運行。

我的問題是,this是否可以成爲詞法範圍的一部分,如果是的話,我該如何理解這一點,這取決於當前函數的調用方式,而詞法範圍將函數限制在他們被定義。

回答

6

只要將它們視爲獨立的擔憂。

  • 函數的變量作用域永遠不會改變。

  • this的值將根據函數的調用方式發生變化。給定相同的功能,不同的調用賦予相同的功能一個不同的this

    var foo = (function() { 
           var bar = "bar"; 
           return function() { console.log(bar, this); }; 
          })(); 
    
    foo(); // the default `this` 
    
    var someObj = {some: "object"}; 
    foo.call(someObj); // `this` is someObj 
    
    var aDiffObj = {aDiff: "object"}; 
    foo.apply(aDiffObj); // `this` is aDiffObj 
    
    var anotherObj = {another: "object", foo:foo}; 
    anotherObj.foo();  // `this` is anotherObj 
    
    var binderObj = {binder: "object"}; 
    var bound = foo.bind(binderObj); 
    bound();    // `this` is binderObj 
    
    new foo(); // `this` is a new object being constructed, 
          //  which has the prototype of `foo` in its prototype chain 
    

    所有調用可以訪問bar變量,但不同的this值。

因此,考慮在ECMAScript中當前函數的語法,this將永遠不會被從詞法範圍拍攝,但始終被分配基於調用的值。

有在將可能有一個詞彙this作品的新函數的語法,但是這在將來某個時候。

+2

別忘了綁定! (雖然有點不同) – Ian

+0

不要忘記'新'! – acjay

+0

@伊恩:是的,忘了那個。我會更新。 ... @@ acjohnson55和'new'。 –

2

的ES6箭頭函數聲明語法改變JavaScript的「這個」綁定規則,以便「這」總是指的是詞彙的上下文,而不是取決於函數是如何調用改變。

這定義了「這個」詞法作用域...

var myFunc =() => { 
    // function contents here 
} 

上方的箭頭的函數聲明的語法重新定義「這個」結合到「詞彙此。「儘管要小心,但有充分的理由不要通過使用'this'來混淆這個問題,因爲代碼中有兩套不同的綁定規則。如果你可以通過.bind(這個)和平來避免它,那麼你的狀態可能會更好。