10

我在需要直接访问的函数中有一个函数。

//#############################################################
//# Global vars
//#############################################################
var canvasWidth = 585;
var canvasHeight = 780;

//#############################################################
//# Init the canvas
//#############################################################
window.onload = function() {
    initStage();
};

//#############################################################
//# Init the main stage
//#############################################################
function initStage() {

    //*************************************************************
    //* Create a stage to work with
    //*************************************************************
    var stage = new Kinetic.Stage({
        container: "container",
        width: canvasWidth,
        height: canvasHeight
    });

    var layerOne = new Kinetic.Layer();
    var imageObj = new Image();

    //*************************************************************
    //* Load the image into a layer on the stage
    //*************************************************************
    ... Some Code ...

    //*************************************************************
    //* Set the hidden field value to the canvas dataURL
    //*************************************************************
    function autoSave(){
        stage.toDataURL({
            callback: function(dataUrl){
                document.getElementById("mapping-form:hiddenDataURL").value = dataUrl;
                console.log("Auto Save excecuted");
            }, 
            mimeType: 'image/jpeg', 
            quality: 1.0
        });        
    }

    //*************************************************************
    //* Function called to add text to the stage
    //*************************************************************
    ... Some Code ...    

        layerTwo.add(txt);
        stage.add(layerTwo);

    });

}

我正在尝试访问 autoSave() (作为回报,它需要来自父函数的阶段 var)。我理解为什么我无法访问它,但我正在努力了解如何更改代码以使其可访问。

我的第一个想法是简单地声明一个“更高范围”的 var 并将函数分配给它。问题是(据我所知)这实际上不允许我在请求的时间执行 autoSave() 。

为这个问题的“基本性质”道歉,我是 JS 的新手,我认为这将是基本的!

4

5 回答 5

18

您可以使您的函数全局可访问,并且仍然保持对创建它的范围内的变量的引用。只需在窗口范围内创建和分配它 - 例如,而不是将其定义为:

function autoSave() {
    // ... code ...
}

将其声明为:

window.autoSave = function() {
    // .... code ....
}

您现在可以在任何地方调用它(当然,前提是首先调用了 initStage 方法来声明它)。

于 2013-02-08T09:24:01.500 回答
5

您可以将 autoSave 功能分配给 this 对象,即

function initStage() {        
    ... Some Code ...
    this.autoSave = function(){
        ... Some Code ...        
    }

    return this;
}

现在你可以打电话

initStage().autoSave();
于 2013-02-08T09:21:56.770 回答
0

正如您在此处看到的autoSave,调用没有问题。我相信问题出在代码的其余部分。你有});在脚本的底部;不能在任何地方打开

代码尽可能简单

window.onload = function() {
    initStage();
};

function initStage() {
    alert('a');

    function autoSave() {
        alert('b');
    }

    autoSave();
}
于 2013-02-08T09:29:18.860 回答
0

您可以访问您的本地功能,如下所述

var myFunc = function () {
  //Local Scope
  this.scopeLocal = function () {
    alert("yipee!!! You Can Call Me");
  }
}

var myfunc = new myFunc();//Create a Object

window.onload = function () {
  myfunc.scopeLocal(); // Call it Globally
};

在这里查看演示:http: //jsbin.com/efojom/1/edit

于 2013-02-08T09:33:49.657 回答
0

一般来说,我会建议这样的事情:您可以使用您的个人命名空间来使函数和对象可用。

// make a scope wrapper to keep vars local
(function () {
    // your module vars available within this scope
    var canvasWidth = 585;
    var canvasHeight = 780;

    // create a namespace
    var myspace = {
        stage: new Kinetic.Stage({
            container: "container",
            width: canvasWidth,
            height: canvasHeight
        },
        autoSave: function () {
            this.stage.toDataURL({
                callback: function(dataUrl){
                    document.getElementById("mapping-form:hiddenDataURL").value = dataUrl;
                    console.log("Auto Save excecuted");
                }, 
                mimeType: 'image/jpeg', 
                quality: 1.0
            });
        }
    };

    var layerOne = new Kinetic.Layer();
    var imageObj = new Image();

    layerTwo.add(txt);
    myspace.stage.add(layerTwo);


    // finally export to global namespace only what you really need
    window["myspace"] = myspace;
});

// then from anywhere, just call this

myspace.autosave();
myspace.stage;
于 2013-02-08T10:32:38.740 回答