如何在函数外部获得点击次数

时间:2014-09-04 13:00:42

标签: javascript jquery function closures

嗨,这是我正在玩的代码

//define a function
var test=function() {

 var v=0;
 var counter=0;
  // click on the element id=z2
 $('#z2').click(function(){

  v = ++counter;
   //call function testdata 
  testdata();

  })

  function testdata() {

   return v;

   } // end of testdata

   } // end of  var test

     //calling p outside of the scope of var test.
    var p =test.testdata();

现在p应返回v的值,但它在console.log中显示为undefined。

请提出任何建议

3 个答案:

答案 0 :(得分:0)

您需要将v定义为int,如此

var v = 0;

此函数也将返回undefined,因为该函数仅返回其未定义的参数

我很难理解你的问题,但这就是我要做的事情:

//define a function
var test = function() {

    var v = 0;
    var counter=0;
    // click on the element id=z2
    $('#z2').click(function(){
        v = ++counter;
        return v;
    })
} // end of  var test

var p = test();

答案 1 :(得分:0)

您的代码无法正常工作的原因是因为testdata仅存在于函数test的范围内(使其成为私有函数) - 在test内调用它会有效,但就你的其他代码而言,它并不存在。

使这项工作的一种方法是使用test作为构造函数,将变量保持为私有但将函数设为公共,如下所示:

// define constructor
var Test = function() {

    // private
    var v = 0;
    var counter = 0;
    var that = this;

    // click on the element id=z2
    $('#z2').click(function(){
        v = ++counter;
        //call function testdata 
        that.testdata();
    });

    // public
    this.testdata = function() {
        return v;
    }
}

var p = new Test();
p.testdata(); // works!

此处的演示演示:http://jsfiddle.net/fissioncat/tg84mbwp/4/

答案 2 :(得分:0)

您的代码存在两个主要问题。

如果你运行它,它会抛出一个错误(1): test.testdata is not a function ! 如果您使用控制台查找test.testdata,您将看到未定义(错误(2))。 如果你尝试var p = testdata(),它也会抛出一个错误(3): testdata is undefined !

您已在函数test中定义了函数testdata 。测试中的任何代码都可以看到 您的函数testdata,但任何代码外部测试都看不到它。 您的var p调用testdata 之外。这就是为什么错误(3)。

通过在测试中定义testdata,您可能会认为它会自动添加到测试中作为属性。事实并非如此。您可以向函数添加属性,但这必须在此函数之外发生。这就是错误(1)和(2)的原因。

让我们试试:

// declare your functions by name,
// you later can call them by name without need for a variable
function test() {
    // one variable is enough here
    var c = 0;
    $("#z2").click(function() {
        ++c;
        testdata();
    });
}
// function testdata declared by name outside function test
function testdata() {return c;}
// now we can attach testdata as a property to test
test.testdata = testdata;

var p = c; // should be 0 but is undefined
var p = testdata(); // no error, but undefined.
var p = test.testdata(); // no error, but undefined. Why?

与错误(3)相同的问题,但现在变量 c 。它被声明为内部测试, 外面的所有代码都看不到它。 (查找关键字范围关闭以了解详情);

我们再试一次:

// declare var c outside, so it's in the global scope,
//all following code can see it.
var c = 0;
function test() {
    $("#z2").click(function() {
        ++c;
        testdata();
    });
}
function testdata() {return c;}
test.testdata = testdata;

var p = c; // --> 0
var p = testdata(); // --> 0
var p = test.testdata(); // --> 0

好的,现在让你的点击功能正常工作。