2016-04-22 129 views
-2

我只想在定義此函數時調用函數。我在節點或瀏覽器控制檯中嘗試以下代碼,它是可行的。

slurp = function() { console.log('slurp'); } 
slurp_callable = ('slurp' in this && typeof(this['slurp']) == 'function'); 
console.log('slurp is callable (this)?', slurp_callable); 
if (slurp_callable) { this['slurp'](); } 

但是,如果我等待文件準備就緒(使用jQuery):

$(document).ready(function() { 
    console.log("ready!"); 
    slurp = function() { console.log('slurp'); } 
    console.log('slurp is callable (this)?', ('slurp' in this && typeof(this['slurp']) == 'function')); //False 
    console.log('slurp is callable (self)?', ('slurp' in self && typeof(self['slurp']) == 'function')); //true 
}); 

還給我假,這和真實的自我。

我明白自己是我以前的這個價值,但是我的這個變化是什麼時候?爲什麼?

如何在不使用自我的情況下檢查並調用$(document).ready函數?

回答

1

基本上self將指向window.self,如果你不覆蓋它。

slurp = function() { console.log('slurp'); } 

在這裏,你沒有提到的var/let/..定義方法,因此slurp將獲得分配給window

因此,此代碼,

('slurp' in self && typeof(self['slurp']) == 'function') 

等於

('slurp' in window.self && typeof(window.self['slurp']) == 'function'). 

而且window.self == window。因此你得到true作爲結果。

2

this的值取決於如何調用它所顯示的函數。

在第一個示例中,您將其稱爲任何函數之外,在第二個示例中,您將其稱爲ready事件處理函數。

您可以使用window而不是this(在瀏覽器中)明確檢查它是否是全局的。

+0

是的,但在第二個示例中,我並沒有在調用ready事件處理函數時調用的函數內部定義函數slurp。這是我不明白的地方。爲什麼這個功能目前無法訪問。 – Naremy

+1

@Naremy - 在第二個例子中,'slurp'是一個全局的(與window.slurp'相同),但'this'與'window'不同,所以'this.slurp'是'undefined'。 – Quentin

1

在函數內部:

$(document).ready(function() { 
    console.log(this); // here this is the document 
}) 

,但如果你寫像以下:

console.log(this); // this is window 

$(document).ready(function() { 
    console.log(this); // here this is the document 
}) 

爲了更清楚,你可以嘗試以下操作:

console.log(this); // this is window 
a = 10; 
console.log(this.a); // 10 

$(document).ready(function() { 
    console.log(this); // here this is the document 
    console.log(this.a); // undefined because a is not defined on the document 

    // but you could access the one defined on the `window` 
    console.log(window.a); // 10 

    b = 10; 
    console.log(this.b); // still undefined because `b` is not set on the document but is local to this function. 

    this.c = 10; 
    console.log(this.c); // 10 
}) 
相關問題