javascript - 在 javascript 中使用闭包时出现类型错误

标签 javascript jquery closures

我正在执行闭包示例,请检查下面的代码

function Counter()
{ 
    var count=0;
    var counterIncrement=function()
    {
        count++;
        console.log(count);            
    }
    return counterIncrement;  
    
}

var v=Counter();
v.counterIncrement();

错误:请解释

"message": "Uncaught TypeError: v.counterIncrement is not a function",
"filename": "https://stacksnippets.net/js",
"lineno": 26,
"colno": 3

最佳答案

更新:

这是OP在评论中要求的扩展答案。

所以OP问如果你里面有两个函数怎么办?你会怎么调用它?很简单,只需返回一个对象并将函数处理程序分配给每个属性即可。

示例:

function Counter()
{
    var count=0;
    var counterIncrement = function()
    {
        count++;
        console.log(count);
    }

    var increment = function(value) {
        count += value;
        console.log(count);
    }

    // return as an object with reference to the functions
    return {
        counterIncrement : counterIncrement,
        increment : increment
    }
}

var v= Counter();
v.counterIncrement();
v.increment(100);

---- 上一个答案 ------

当您执行 var v=Counter(); 时,本质上您正在执行函数 Counter() 并将其返回值分配给 v.

在这种情况下,Counter() 将返回对函数 counterIncrement 的引用。

因此变量 v 现在包含一个名为 counterIncrement() 的可调用函数。当您执行 v.counterIncrement() 时,您的 JavaScript 引擎会将代码视为 counterIncrement.counterIncrement(),该代码会解析为未定义的属性。这会产生您所看到的错误消息。

仅调用 v() 就足够了。

function Counter()
{
    var count=0;
    var counterIncrement=function()
    {
        count++;
        console.log(count);
    }
    return counterIncrement;

}

var v= Counter();
v();

关于javascript - 在 javascript 中使用闭包时出现类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45071470/

相关文章:

javascript - 使用循环函数简化代码

javascript - 如何监控用户点击了什么

javascript - Input type FILE multiple - 按顺序添加文件

ios - SwiftUI:解除警报时如何执行关闭?

ios - 从 Facebook FBSDK iOS 4.x(使用 Swift)获取值?

javascript - 尝试通过循环数组失败来使用 jQuery 重新显示页面中的隐藏元素

javascript - YUI 3 中 jQuery(this) 的替代品是什么?

javascript - Jquery slimscroll 不隐藏

javascript - autoNumeric 不允许从数字键盘/Internet Explorer 输入十进制

javascript - 使用闭包迭代带有变量的 jQuery 选择器