JS这个和自己都没有工作

时间:2016-03-28 20:18:23

标签: javascript this self

如此处所见How to access the correct `this` context inside a callback?我尝试使用self而不是this。这是一个关于JS的愚蠢问题,但我想要一些解释,我该怎么做才能做到正确。

(function (global) {

    "use strict";
    var self = this;

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

它没有用:)我做错了什么?我在Cordova btw中使用此代码..错误如下

Uncaught TypeError: Cannot set property 'test' of undefined

2 个答案:

答案 0 :(得分: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指向某个其他对象,那么您将必须解释您期望它指向的内容,然后我们可以为您提供如何引用该特定对象的建议。 / p>

请勿删除"use strict";以使其有效。使用strict模式时代码无法正常运行这一事实意味着您的代码使用strict模式旨在防范的错误做法。相反,您应该继续使用strict模式,而是修复代码以停止使用不良做法并使用strict模式正常工作。

为了将来参考,如果您想了解Javascript如何决定在函数调用中设置this的内容,您可以阅读以下答案:When you pass 'this' as an argument。该答案列出了确定this值的五种不同方式。

答案 1 :(得分:1)

只需删除"use strict";行:

(function (global) {
    var self = this;

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

Fiddle