访问在其他方法中的方法中创建的变量

Access variable created in a method in other method

提问人:prettyInPink 提问时间:2/16/2016 最后编辑:Rory McCrossanprettyInPink 更新时间:2/16/2016 访问量:369

问:

我一遍又一遍地为同一个主题发疯,可变范围。 在此基础上创建一个全局变量不起作用,我尝试在一个函数中返回值以使用另一个函数,但总是在控制台中返回“未定义”错误。 这是代码的简单标记:

domElement.plugin({
    method1: function() {
        // create variable
        var myvar = 1;
        // other things going on here in this method
    },
    method2: function() {
        // use variable
        console.log(myvar);
    }
});

这是一个 jquery 插件,我尝试访问在 method1 中创建的 var myvar 的值(并且是变量)在 method2 中。 我在论坛上找到了一些东西,但似乎无法让它们中的任何一个工作,因此任何帮助都非常感谢。

JavaScript jQuery 函数 变量 方法

评论

1赞 Johannes Jander 2/16/2016
这是一个范围问题,该变量在另一个函数中根本不可见。
0赞 Johannes Jander 2/16/2016
javascript 的可能重复:在另一个函数中获取一个函数的变量值

答:

3赞 millerbr 2/16/2016 #1

你不能,它不会再在范围内了。您需要在该范围之外定义变量,并在函数内部进行赋值。

domElement.plugin({
    myvar:null,
    method1: function() {
        // create variable
        myvar = 1;
        // other things going on here in this method
    },
    method2: function() {
        // use variable
        console.log(myvar);
    }
});

在另一条评论中提到,您可以在一种方法中定义变量,然后将其传递给另一个方法 - 但仅当您计划仅从第一个方法内部使用第二个方法时,这才有效。该变量仍然无法从方法外部访问。

评论

0赞 prettyInPink 2/16/2016
使用上面的代码并记录变量适用于 method1,但对于第二个,它返回一个“未定义”错误(不是未定义),可能是插件本身吗?
0赞 millerbr 2/16/2016
您是在 method1 之前还是之后运行 method2? 只有在调用 method1 后才会有一个值,除非您首先使用值初始化它。可以通过执行而不是在我的示例的第 2 行来做到这一点myvarmyvar:1,myvar:null,
3赞 Rory McCrossan 2/16/2016 #2

您需要使两种方法都可以访问变量范围:

domElement.plugin({
    myvar: null, 
    method1: function() {
        this.myvar = 1;
    },
    method2: function() {
        console.log(this.myvar); // = null or 1 depending on when you call this function
    }
});

或者,您可以将其从一个方法传递到另一个方法:

domElement.plugin({
    method1: function() {
        var myvar = 1;
        this.method2(myvar);
    },
    method2: function(v) {
        console.log(v); // = 1
    }
});

我个人会使用第一个例子。

评论

0赞 prettyInPink 2/16/2016
对不起,不是我的 downvote.current,使用上面的代码返回,method1: number 是:NaN,type 是:number,method2: undefined
0赞 prettyInPink 2/16/2016
我将尝试在小提琴中重新创建它。插件是一个 jquery 滑块,function1 在滑块每次移动时运行,这个函数在外部获取一个值(并正确记录它),这个值需要在 function2 内部使用,function2 每次重新加载页面时都会运行。由于 api,var 的值保留在内存中。不确定这是否有任何意义。
0赞 prettyInPink 2/16/2016
对不起,我在您的示例中使用的代码中有一个小错误,但它效果很好!感谢一百万!!
2赞 Julien Leray 2/16/2016 #3

两种最简单的方法:

全球范围:

var myvar;
domElement.plugin({
    method1: function() {
        // create variable
        myvar = 1;
        // other things going on here in this method
    },
    method2: function() {
        // use variable
        console.log(myvar);
    }
});

不要过多地使用全局范围,这有点乱;最好使用 Object:

Object 属性:

domElement.plugin({
    myVar: 1,
    method1: function() {
        // create variable
        this.myVar = 1;
        // other things going on here in this method
    },
    method2: function() {
        // use variable
        console.log(this.myVar);
    }
});

我鼓励你使用第二种方法。

1赞 Billy Moon 2/16/2016 #4

这可能看起来有点啰嗦,但您可以使用立即调用的函数表达式为您的方法创建共享范围......

// create shared scope for methods
var methods = (function() {
    // create variable in shared context
    var myvar;
    // define method1
    function method1() {
        // assign value to variable
        myvar = 1;
        // other things going on here in this method
    }
    // define method2
    function method2() {
        // use variable
        console.log(myvar);
    }
    // return methods
    return {
        method1: method1,
        method2: method2
    }
// execute the scope function immediately...
}());

// assign methods to plugin
domElement.plugin({
    method1: methods.method1,
    method2: methods.method2
});

这是有效的,因为 javascript 是函数作用域的,而不是块作用域的,并且在两种方法都可以访问的父作用域中声明变量意味着它们都将对同一变量进行操作。此外,该变量对作用域的上下文保持私有,因此无法从外部访问和修改。此模式有助于管理可以彼此共存而不会发生冲突的任意模块。