为什么我无法在具有嵌套函数的函数内声明变量?

时间:2015-08-13 08:38:41

标签: javascript jquery

我试图在一个带有嵌套函数的函数内声明一个var var origPage;(不是嵌套函数,而是外部函数),但由于某种原因它没有注册。

function noticeSearch() {

    var origPage = null;

    $(".srh-input").keyup(function(e) {
        var e = e || event;
        keycode = e.which || e.keyCode;
        var keyword = $(".srh-input").val();
        console.log(origPage);
        console.log(currentPage);
        if ((e.which == 8) && (keyword === "")) {
            currentPage = origPage;
        } else if (keyword === "") {
            tooltip(".srh-input", "请输入关键字查询");
            origPage = currentPage;
        } else {
            $(".srh-input").tooltip('destroy');
            currentPage = 1;
        }
        $("#srh-btn").trigger("click");

    });

    $("#srh-btn").on("click", function() {

        notice.findList();
    });
}

当我运行它时,它表示变量origPage在我的控制台中是未定义的。我的keyword === ""一开始总是返回true,因此origPage应设置为我所在的任何页面,但事实并非如此。我无法在我的keyup函数中声明它,因为我不想在每次按键后将我的变量重置为undefined。我不允许在包装函数中声明变量吗?

编辑:currentPage已经定义。很抱歉没事先提及。

我现在遇到了一个新问题。一旦我将origPage的值更改为null,我的其他代码似乎都没有运行。我会尽力解决这个问题。

4 个答案:

答案 0 :(得分:0)

无论currentPage是否先前已定义,它都会在您声明它的函数范围内丢失(除非您在窗口中定义了它)。设置origPage = currentPage时,您将在与定义currentPage不同的范围内进行分配。请注意,您正在将回调函数传递给keyup函数,该函数不具有您假设的本地作用域。使currentPage成为全局变量可能会解决此问题。

答案 1 :(得分:0)

我认为你的问题更多地归结为问题逻辑

var currentPage = 1;

function noticeSearch() {

    var origPage = null;

    $(".srh-input").keyup(function (e) {
        var e = e || event;
        keycode = e.which || e.keyCode;
        var keyword = $(".srh-input").val();
console.log('orig page is : ' + origPage);

        if ((e.which == 8) && (keyword === "")) {
            currentPage = origPage;
            console.log('case 1');
        } else if (keyword === " ") {
            //tooltip(".srh-input", "请输入关键字查询");
            origPage = currentPage;
            console.log('orig page is set to: ' + origPage);
            console.log('case 2');
        } else {
            //$(".srh-input").tooltip('destroy');
            currentPage = 1;
            console.log('case 3');

        }
        $("#srh-btn").trigger("click");

    });

    $("#srh-btn").on("click", function () {

        notice.findList();
    });
}

noticeSearch();

使用此代码我可以获得origPage的值来记录就好了。只需按一次空格即可进入第一个else if

https://jsfiddle.net/fzw8xv5b/3/

你的问题是这个

if ((e.which == 8) && (keyword === "")) {
    currentPage = origPage;
} else if (keyword === "") {
    tooltip(".srh-input", "请输入关键字查询");
    origPage = currentPage;    

即检查退格按钮是否按下且输入为空。否则检查输入是否为空。除了退格键之外,该行可能永远不会被调用为导致键盘输入为空的原因?

答案 2 :(得分:0)

另一个解决方案:你的keyup函数不知道origPage,因为它是一个事件处理程序,而且是因为闭包。或者,您可以传递它在此处使用的数据。

function noticeSearch(){

var origPage = null;

$(".srh-input").on('keyup', {origPage: origPage}, function(e) {
    var e = e || event;
    keycode = e.which || e.keyCode;
    var keyword = $(".srh-input").val();
    console.log(origPage);
    console.log(currentPage);
    if ((e.which == 8) && (keyword === "")) {
        currentPage = origPage;
    } else if (keyword === "") {
        tooltip(".srh-input", "请输入关键字查询");
        origPage = currentPage;
    } else {
        $(".srh-input").tooltip('destroy');
        currentPage = 1;
    }
    $("#srh-btn").trigger("click");

});

$("#srh-btn").on("click", function() {

    notice.findList();
});

}

希望这有帮助。

答案 3 :(得分:-1)

将声明置于noticeSearch()之外并使其成为全局声明:

var origPage = null;
function noticeSearch() {
    //....
}

我不确定这是否是最好的方法,但它肯定会有用。