在另一个上下文中设置变量

时间:2012-01-12 19:52:30

标签: javascript image syntax onload strict

我有以下功能

"use strict";
function Player
{
    this.width;
    this.height;
    this.framesA = 5;

    this.image = new Image();
    this.image.onload = function ()
    {
        width = this.width;
        height = this.height / framesA;
    }
    this.image.src = "Images/angel.png";
}

如何使此代码生效?
我想要在调用onload函数时,使用Player函数的宽度和高度来确定图像的宽度和高度。

我需要使用严格模式(A必须)。

如果这应该以另一种方式完成,请随时教导。

编辑:我更新了代码以反映更现实的情况(我不知道这会如此复杂)

编辑2:代码的另一次更新。我没有注意到我写了这个变种。遗憾。

提前致谢

4 个答案:

答案 0 :(得分:2)

只需设置变量并在onload事件中进行操作,它们就会保留在范围内。

"use strict";
function Player
{
    this.image = new Image();
    this.image.src = "Images/angel.png";
    this.image.onload = function ()
    {
        var width = this.width;
        var height = this.height;
        // Do your manipulations within the `onload` event.
    } 
}

答案 1 :(得分:2)

我从您的评论中收集到的是,您希望能够从Player函数外部访问宽度和高度,问题是您不知道宽度和高度何时可用。< / p>

如果这是正确的,它会变得有点复杂。由于您不知道何时加载图像并且在加载图像之前无法获得宽度和高度(除非您在img标签服务器端指定它们),您需要使用一个函数一个回调来访问玩家的宽度和高度。

基本上,如果还不知道宽度和高度,该函数只是将回调放入队列中。确定宽度和高度后,将调用队列中的所有函数,并将宽度和高度作为参数传递给它们。如果在调用函数时已经知道维度,它应该立即使用正确的参数调用回调函数。

以下是我如何做到这一点:

function Player() {
    'use strict';

    // Store this in a variable so the onload handler can see it.
    var that = this;
    var callbacks = [];

    this.frames = 5;

    this.getDimensions = function (callback) {
        // We don't have the dimensions yet, so put the callback in the queue.
        callbacks.push(callback);
    };

    this.image = new Image();
    this.image.onload = function () {
        var width = this.width;
        var height = this.height / that.frames;

        // Call each of the registered callbacks.
        var i;
        for (i = 0; i < callbacks.length; i += 1) {
            callbacks[i](width, height);
        }
        // Don't keep unnecessary references to the functions.
        callbacks = null;

        // We now know the dimensions, so we can replace the getDimensions
        // function with one that just calls the callback.
        that.getDimensions = function (callback) {
            callback(width, height);
        };
    };
    this.image.src = "Images/angel.png";
}

以下是您访问尺寸的方式:

var p = new Player();
p.getDimensions(function (width, height) {
    console.log("Player's width is " + width + " and height is " + height);
});

答案 2 :(得分:0)

以下是 Šime Vidas的真正含义

"use strict";
function Player {
    this.image = new Image();
    this.image.src = "Images/angel.png";
}

Player.prototype.getWidth = function() {
    return this.image.width;
}

或者你喜欢基于闭包的对象

function Player {
    this.image = new Image();
    this.image.src = "Images/angel.png";
    this.getWidth = function() {
      return this.image.width;
    }
}

答案 3 :(得分:0)

此变体通过JSLint没有任何问题,也运行良好。那有什么问题?

function Player() {
    "use strict";
    var width, height;
    this.image = new Image();
    this.image.onload = function () {
        width = this.width;
        height = this.height;
    };
    this.image.src = "Images/angel.png";
}

请注意,您应该放置“use strict”;内部功能,而不是外部。