【问题标题】:Access variable created in a method in other method在其他方法中的方法中创建的访问变量
【发布时间】:2016-05-26 15:55:13
【问题描述】:

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

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 插件,我试图访问在 method2 内部的 method1(并且是变量)中创建的 var myvar 的值。 我在论坛上发现了一些东西,但似乎无法让它们中的任何一个工作,因此任何帮助都非常感激。

【问题讨论】:

标签: javascript jquery function variables methods


【解决方案1】:

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

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
    }
});

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

【讨论】:

  • 对不起,不是我的downvote.current,使用上面的代码返回,method1: number is: NaN, type is: number and method2: undefined
  • 我会尝试在小提琴中重新创建它。该插件是一个jquery滑块,每次滑块移动时都会运行function1,该函数从外部获取一个值(并正确记录它),该值需要在function2内部使用,每次页面重新加载时都会运行。由于 api,var 的值保留在内存中。不确定这是否有意义。
  • 抱歉,我在您的示例中使用的代码中有一个小错误,但效果很好!谢谢一百万!!!
【解决方案2】:

你不能,它不再在范围内。您需要在该范围之外定义变量并在函数内部分配。

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);
    }
});

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

【讨论】:

  • 使用上面的代码并记录变量适用于 method1 但对于第二个它返回一个“未定义”错误(不是未定义),可能是插件本身吗?
  • 你是在method1之前还是之后运行method2? myvar 只有在 method1 被调用后才会有一个值,除非你首先用一个值初始化它。可以通过在我的示例的第 2 行执行 myvar:1, 而不是 myvar:null, 来做到这一点
【解决方案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);
    }
});

不要过多的使用全局作用域,有点乱;更好地使用对象:

对象属性:

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);
    }
});

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

【讨论】:

    【解决方案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 是函数作用域,而不是块作用域,并且在两个方法都可以访问的父作用域中声明变量意味着它们都将对同一个变量进行操作。此外,该变量对范围的上下文仍然是私有的,因此不能从外部访问和修改。这种模式有助于管理可以相互共存而不会发生冲突的任意模块。

    【讨论】:

      猜你喜欢
      • 2012-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多