簡體   English   中英

用'this'定義的函數,但沒有'this'執行

[英]Function defined with 'this', but executing without 'this'

我期待第二次調用“taco”函數來生成運行時錯誤,因為我沒有使用“this”關鍵字調用它:

function foo() {
    var bar = "baz";

    this.taco = function() {
        console.log(bar);
    };
    this.taco();
    taco(); // I expected a runtime error here.     
}

foo();

但事實並非如此。

這是相同代碼的小提琴: http//jsfiddle.net/phillipkregg/gdFxU/226/

JavaScript是否在這里使用某種類型的隱式上下文管理?

好奇,謝謝!

原因是當你調用foo() ,你在window對象的范圍內調用它。 這意味着在foo()內部, this的值設置為window

因此, this.taco()實際上是window.taco() ,它與taco()相同。 換句話說, taco()是一個全局函數,所以當thiswindow時,它可以將其稱為taco()window.taco()this.taco()

如果你將taco()作為一個像這樣的新對象,其中this被設置為一個新的foo實例並且不等於window ,那么你會得到預期的運行時錯誤:

function foo() {
    var bar = "baz";

    this.taco = function() {
        console.log(this);
        console.log(bar);
    };
    this.taco();
    taco(); // I expected a runtime error here.     
}

var x = new foo();

示例: http//jsfiddle.net/jfriend00/3LkxU/


如果你感到困惑的價值this ,有確定的值,這些JavaScript規則this

  1. 如果你調用一個函數newx = new foo()那么一個新的實例foo創建和值this設置為對象的內部foo()函數和新的實例從返回foo()由默認。

  2. 如果你平時調用任何類的函數foo()則該值this被設置為全局對象,在瀏覽器window中的JavaScript的新的“嚴格”的模式,或者如果,那么this將是undefined 這就是您原始示例中發生的情況。

  3. 如果調用像一個對象引用的方法obj.foo()那么this將被設置成為obj對象。

  4. 如果你犯了一個函數調用.apply().call()那么你就可以明確控制哪些值this被設置為與第一個參數.apply().call() 例如: foo.call(obj)將調用foo()函數並將this指針設置為obj對象。

  5. 如果您沒有進行任何函數調用(例如,在全局范圍內),那么this將是Global對象(瀏覽器中的window )或在嚴格模式下undefined

  6. 與上述所有規則一樣, this取決於調用者如何調用您,而不是如何定義函數/方法。

原因是this在FOO(),當它被稱為就像是,將引用一個全局對象。 這意味着taco功能將在全球范圍內引入。

要獲得所需的功能,請使用new foo()語法。 然后this將引用一個新對象,將為taco屬性分配一個新值(函數)。 直接調用taco會給你一個錯誤。

foo(); // equals window.foo() , `this` equals `window` and `this.taco` equals `window.taco` and `window.taco`  equals `taco` as it is global

new foo(); //creates a new object. this will give error because here `this.taco` is not `taco`

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM