我无法在jquery中访问我的闭包函数

时间:2018-03-30 05:43:04

标签: javascript jquery

如何从我的谈话活动中调用sayIt函数。我整夜都在和它斗争。

$(document).ready(function () {


   var sayIt = (function() {
        alert("I can now say something.");
    })();


    $("#talk").blur(function(){

       sayIt(); //<-- Uncaught TypeError: sayIt is not a function
    });

});

6 个答案:

答案 0 :(得分:4)

sayIt不是function,因为您将该函数声明为自调用函数,而sayIt只存储它返回的值。

$(document).ready(function () {


    var sayIt = function() {
        alert("I can now say something.");
    };

    sayIt(); // it you want to call it once

    $("#talk").blur(function(){

       sayIt(); //<-- Uncaught TypeError: sayIt is not a function
    });

});

答案 1 :(得分:3)

您正在sayIt中使用自我调用功能,因此它将在页面加载时独立执行并提醒文本。但是,当标识为talk的元素模糊时,您需要发出警报。因此,删除该函数闭包,它按预期工作。

&#13;
&#13;
$(document).ready(function () {
   var sayIt = function() {
        alert("I can now say something.");
    };
    $("#talk").blur(function(){
       sayIt();
    });

});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type='text' id='talk' />
&#13;
&#13;
&#13;

答案 2 :(得分:2)

你问题的关键是自我调用功能。当你把();在函数声明结束后,它意味着函数将调用自身。将您的功能更改为 -

$(document).ready(function () {
   // declaration of function //
   var sayIt = (function() {
    alert("I can now say something.");
   });

    $("#talk").blur(function(){
       sayIt(); //this will work fine
    });

 });

答案 3 :(得分:1)

在这种情况下,它不是一个功能。这是一个自我调用功能。

您需要将sayIt的代码更改为:

var sayIt = function () {
  alert("I can now ay something.");
}

只有这样你才能从模糊事件中调用sayIt。

答案 4 :(得分:0)

您尝试在blur上执行的函数是IIFE (立即调用的函数表达式),它在定义时运行,返回值为undefined(如果未明确返回任何内容) )存储在IIFE 的变量sayIt中。这意味着sayIt不保留该函数,并且当您尝试将其作为导致错误的函数(sayIt())执行时:

为了获得预期的功能变化:

var sayIt = (function() {
    alert("I can now say something.");
})();

要:

var sayIt = function() {
    alert("I can now say something.");
}

答案 5 :(得分:0)

您正在使用自动调用功能,它会自动调用。因此,如果您需要调用此函数,则应从代码中删除(),以便代码如下所示 -

var sayIt = function() {
    alert("I can now say something.");
});

但是如果你想用()调用,那么你需要使用像

这样的clouser策略
var sayIt = (function() {

    return function () {
        alert("I can now say something.");
    };
})();