JS this 和 self 不起作用

JS this and self don't work

如此处所示 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

只需删除 "use strict"; 行:

(function (global) {
    var self = this;

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

Fiddle

使用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 值的五种不同方式。