JS这个和自己都行不通

use*_*356 -1 javascript this self

如下所示如何在回调中访问正确的`this`上下文?我试着用自己而不是这个.这是一个关于JS的愚蠢问题,但我想要一些解释,我该怎么做才能做到正确.

(function (global) {

    "use strict";
    var self = this;

    function onDeviceReady () {
        self.test = "123";
        loadMapsApi();
    }
    function loadMapsApi () {
        console.log(self.test);
    }
})(window);
Run Code Online (Sandbox Code Playgroud)

而且它不起作用:)我做错了什么?我在Cordova btw中使用此代码..错误如下

Uncaught TypeError: Cannot set property 'test' of undefined
Run Code Online (Sandbox Code Playgroud)

jfr*_*d00 7

使用strict模式时,this正常函数调用的值为undefined.这正是你的情况.你的功能:

(function (global) {

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

})(window);
Run Code Online (Sandbox Code Playgroud)

只是一个普通的函数调用因此this将是未定义的.如果不使用strict模式,则this在正常函数调用中将设置为全局对象.否则,this只有在以某种其他方式调用函数时,才会将其设置为唯一值(with new,with .apply()或with .call()in obj.method()).


self工作在你身边正在使用是的情况下this已经指着所需的对象,要保存在回调以后使用该引用.由于代码中不是这种情况,并且不清楚您希望this在代码中使用什么,因此不清楚使用什么建议来修复您的问题而不进一步描述您试图引用的对象.

如果您只想引用全局对象,那么您只需引用global.test代码即可.

(function (global) {

    "use strict";

    function onDeviceReady () {
        global.test = "123";
        loadMapsApi();
    }
    function loadMapsApi () {
        console.log(global.test);
    }
})(window);
Run Code Online (Sandbox Code Playgroud)

如果您希望this指向其他某个对象,那么您将必须解释您期望它指向的内容,然后我们可以为您提供如何引用该特定对象的建议.


不要只是移除"use strict";以使工作.使用strict模式时代码无法正常工作这一事实意味着您的代码使用了一种错误的做法,即strict模式旨在防范.相反,您应该继续使用strict模式,而是修复您的代码以停止使用不良做法并使用strict模式正常工作.


为了将来参考,如果你想了解Javascript如何决定this在函数调用中设置什么,你可以阅读这个答案:当你将'this'作为参数传递时.该答案列出了this确定价值的五种不同方式.