【问题标题】:variable definition in javascriptjavascript中的变量定义
【发布时间】:2016-08-31 07:15:26
【问题描述】:

我不知道如何描述我的问题。

(function(fn){
    var able=123;
    function tmp(){
        fn()
    };
    tmp();
})(function(){alert(able)});

这个 sn-p 抛出一个引用错误:able is not defined'。

您能否向我解释一下 javascript 如何获取变量?

【问题讨论】:

标签: javascript variables referenceerror


【解决方案1】:

“fn”函数的作用域和“parent”函数的作用域不同,调用fn函数的时候应该传入“able”参数,然后在fn函数本身中实例化,如下:

(function(fn){
    var able=123;
    function tmp(){
        fn(able)
    };
    tmp();
})(function(able){alert(able)});

【讨论】:

  • 你sn-p顺利。但我认为它不能解决我的问题。我不太明白他们上面提到的,IIFE!很困惑。
  • 这里唯一要理解的就是变量声明,如果你在一个函数中设置了var声明,那么只有那个函数和它里面的函数才能访问那个变量,如果我们改变代码的话this: var able=123; (function(fn){ function tmp(){ fn() }; tmp(); })(function(){alert(able)}); 在这种情况下“able”在上层范围内,这允许在同级或低级的所有函数中访问该变量。
  • 我认为函数中变量的范围可能是在函数取消清除时设置的。
  • 在 JavaScript 中,范围是您可以访问的变量、对象和函数的集合。这个范围是在声明参数函数时设置的。我想是的。
  • 是的,确实是全局范围,但如果你换成另一个函数:function(){ varable=123; (function(fn){ function tmp(){ fn() }; tmp(); })(function(){alert(able)}); Able 不是全局的,而是在上层作用域中,可以从下层作用域函数访问。
【解决方案2】:

函数在创建时创建词法闭包。这意味着当您创建警报函数时,able 变量不存在。将 fn 的执行包装在稍后知道able 的词法闭包中不会影响fn 已经创建的词法闭包。

如果您提出一个可以更好地解释您正在尝试做什么的问题,我们可以建议如何正确使用闭包来表达该想法。

【讨论】:

    【解决方案3】:

    函数本地和全局范围内的 java 脚本支持。 在这种情况下,“能”是您无法在函数外部访问的本地函数范围。
    如果您使用 var 变量将在本地范围内声明。如果你只声明没有var的变量,它将在全局范围内声明

    【讨论】:

    • 我认为我的参数函数是在函数tmp 中执行的,它可以访问able
    【解决方案4】:

    您的代码可以使用命名函数像这样重写:

    var func1 = function(fn) {
        var able=123;
        function tmp(){
            fn()
        };
        tmp();
    }
    var func2 = function() {
        alert(able)
    }
    func1(func2);
    

    我相信这种方式很明显变量“able”是在“func1”内定义的(更准确地说是在其本地范围内),而您正试图在“func2”内访问它,而该“func2”不在“func1”的范围内所以它不能“看到”这个范围。

    更多关于 JavaScript 作用域的信息可以在这里找到:What is the scope of variables in JavaScript?

    【讨论】:

    • 这个我可以理解,但这并不能帮助我理解我的问题。
    • 我刚刚编辑了答案以添加更多信息。如果还不够,请尝试更具体地提出您的问题。
    猜你喜欢
    • 2017-03-05
    • 2018-06-23
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多