2016-03-28 82 views
-1

如在這裏看到How to access the correct `this` context inside a callback?我嘗試使用自己而不是這個。這對JS有點愚蠢的問題,但我想要一些解釋,我該怎麼做才能做到。JS這個和自己不工作

(function (global) { 

    "use strict"; 
    var self = this; 

    function onDeviceReady() { 
     self.test = "123"; 
     loadMapsApi(); 
    } 
    function loadMapsApi() { 
     console.log(self.test); 
    } 
})(window); 

它不工作:)我做錯了什麼?我使用的內部科爾多瓦此代碼順便說一句..錯誤是以下

Uncaught TypeError: Cannot set property 'test' of undefined 
+2

你認爲這是什麼? –

+0

我希望它是一種在不使用params的函數之間共享事物的方法? :D – user2391356

+0

改爲使用'closure'或刪除'use strict'。嚴格刪除會讓你通過'this'訪問'window'。 –

回答

7

使用strict模式下,this的價值正常功能調用是undefined。這正是你的情況。你的函數:

(function (global) { 

    "use strict"; 
    var self = this; 
    ... 

})(window); 

只是一個普通的函數調用所以this是不確定的。如果不使用strict模式,則在正常的函數調用中將this設置爲全局對象。否則,this只有當函數被調用某種其他方式時(new.apply().call()obj.method()),纔會被設置爲唯一值。


self變通您使用是的情況下this已經指着所需的對象,要保存在回調以後使用該引用。由於代碼中並不是這種情況,並且您不清楚在代碼中使用this,所以不清楚使用什麼建議來解決您的問題,而無需進一步描述您嘗試的對象參考。

如果你只是想引用全局對象,那麼你可以在你的代碼中引用global.test

(function (global) { 

    "use strict"; 

    function onDeviceReady() { 
     global.test = "123"; 
     loadMapsApi(); 
    } 
    function loadMapsApi() { 
     console.log(global.test); 
    } 
})(window); 

如果你期待this指向一些其他的對象,那麼你將不得不解釋一下你希望它指向什麼,然後我們可以爲您提供一個想法如何引用特定目的。


不要只是刪除"use strict";使事情工作。在使用strict模式時,您的代碼無法正常工作的事實意味着您的代碼正在使用strict模式旨在防範的不良做法。相反,您應該繼續使用strict模式,而是修復您的代碼以停止使用不正確的練習,並使用strict模式正常工作。


以供將來參考,如果你想學習JavaScript如何決定該如何設定this到一個函數調用中,你可以看到這樣的回答:When you pass 'this' as an argument。該答案列出了確定this的值的五種不同方式。

1

只是刪除"use strict";行:

(function (global) { 
    var self = this; 

    function onDeviceReady() { 
     self.test = "123"; 
     loadMapsApi(); 
    } 
    function loadMapsApi() { 
     console.log(self.test); 
    } 
})(window); 

Fiddle

+0

哈哈!太容易了......哈哈,謝謝! :)我不知道爲什麼我忘了那裏 – user2391356

+0

@ user2391356沒有問題! :) – PDKnight

+0

@ user2391356 - 這是一個不好的建議,不應該完成。使用''use strict''是很好的。而且,刪除它時會使您的代碼正常工作,這意味着您的代碼正在使用「嚴格」模式保護您的不良做法。代碼應該修改爲使用'「use strict」'來代替。 – jfriend00