Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在其他方法中的方法中创建的Access变量_Javascript_Jquery_Function_Variables_Methods - Fatal编程技术网

Javascript 在其他方法中的方法中创建的Access变量

Javascript 在其他方法中的方法中创建的Access变量,javascript,jquery,function,variables,methods,Javascript,Jquery,Function,Variables,Methods,我一次又一次地对同一个话题,变量范围发疯。 在此基础上创建全局变量不起作用,我尝试在一个函数中返回值以使用另一个函数,但总是在控制台中返回“undefined”错误。 这是代码的简化标记: domElement.plugin({ method1: function() { // create variable var myvar = 1; // other things going on here in this method },

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

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的值(并且是variable)。
我在论坛上发现了一些东西,但似乎无法让它们发挥作用,因此非常感谢任何帮助。

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

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

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

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

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

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

两种最简单的方法:

全局范围:

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);
    }
});
不要过多地使用全局范围,它有点凌乱;更好地使用对象:

对象属性:

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

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

这似乎有点冗长,但您可以通过使用立即调用的函数表达式为您的方法创建一个共享范围

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

这是一个范围问题,变量在其他函数中根本不可见。使用上述代码并记录变量可能会重复,但对于method1,它会返回“未定义”错误(未定义),可能是插件本身吗?你是在method1之前还是之后运行method2
myvar
只有在调用method1之后才会有一个值,除非您首先用一个值初始化它。可以通过在示例的第2行执行
myvar:1,
而不是
myvar:null,
来实现这一点对不起,不是我的downvote.current,使用上面的代码返回,method1:number是:NaN,type是:number和method2:undefinedI将尝试在小提琴中重新创建它。该插件是一个jquery滑块,每次滑块移动时function1都会运行,该函数从外部获取一个值(并正确记录),该值需要在function2内部使用,function2每次重新加载页面时都会运行。由于api的存在,var的值保留在内存中。我不确定这是否有意义。很抱歉,我在您的示例中使用的代码中有一个小错误,但它非常有效!万分感谢!!!