Javascript 一个函数在作用域内,一个函数在作用域外,即使两者都定义在同一位置

Javascript 一个函数在作用域内,一个函数在作用域外,即使两者都定义在同一位置,javascript,sharepoint,scope,Javascript,Sharepoint,Scope,这两个函数都是从document.ready调用的: $(document).ready(function () { pnp.sp.web.lists.getByTitle("inReviewContracts").items.getAll().then (function(items) { spContractList = items; constructTable('#in-review-requests-table'); colorT

这两个函数都是从document.ready调用的:

$(document).ready(function () {
    pnp.sp.web.lists.getByTitle("inReviewContracts").items.getAll().then (function(items) {
        spContractList = items;
        constructTable('#in-review-requests-table');
        colorTable();
        getNumVisibleContracts();
        calculateTotalCost();
        populateDashboardNumbers();
    }).catch(function(items) {
        console.log("Catch: ", items);
    });

    const dirMenuElement = document.querySelector('.dir-menu');
    dirMenuElement.addEventListener('change', (event) => {
        constructTable('#in-review-requests-table');
        filterTable("");
    });
});
对constructTable()的两个调用都可以正常工作。filterTable()调用抛出“nota function”错误。这两个函数都是在document.ready之外定义的。两者都没有使用指定的命名空间。 这是实际错误:

Uncaught TypeError: filterTable is not a function
at HTMLSelectElement.<anonymous> (scripts.js:49)

}该问题与JS无关。SharePoint有一个名为“filterTable”的本机函数,我正在覆盖该函数。重命名了该函数,代码正在运行。

为什么不发布实际的函数定义而不是屏幕截图?此外,这些函数不是从“就绪”处理程序调用的,而是从不同的回调函数调用的。如果错误消息为:
不是函数
,您可能正在将
filterTable
重新定义为代码中的其他地方,例如:添加了
filterTable=0
@pointy定义。你介意为你的第二个评论解释一下或提供一个资源吗?我的意思是这两个函数都是从.ready函数内部调用的。错误消息到底说了什么?
function constructTable(selector) {
var list = getContractsFromLocalStorage(); 
if (!list) {
    $(selector).addClass('no-data-text').html("No Data Available");
    return;
}

// Get column names 
var cols = getHeaderValues(list, selector);   

// Traverse JSON data 
for (var i = 0; i < list.length; i++) { 
    var row = $('<tr>');
    for (var colIndex = 0; colIndex < cols.length-1; colIndex++) 
    { 
        var val = list[i][cols[colIndex]];
        if (val) {
            if (colIndex !== cols.length-2) {
                switch (colIndex) {
                    case 0:
                        row.append($('<td><input type="checkbox" class="checkbox-col"></td>'))
                        row.append($('<td class="sca-number-col">').html(val + '</td></tr>'));
                        break;
                    case 1: 
                        row.append($('<td class="contract-duration-col"/>').html(val + '</td></tr>'));
                        break;
                    case 2:
                        row.append($('<td class="requested-cost-col"/>').html(val + '</td></tr>'));
                        break;
                    case 3:
                        row.append($('<td class="total-cost-col"/>').html(val + '</td></tr>'));
                        break;
                    case 4: 
                        row.append($('<td class="contract-term-col"/>').html(val + '</td></tr>'));
                        break;
                    case 5:
                        row.append($('<td class="scarb-review-col"/>').html(val + '</td></tr>'));
                        break;
                    case 6:
                        row.append($('<td class="region-scarb-review-col"/>').html(val + '</td></tr>'));
                        break;
                    case 7:
                        row.append($('<td class="status-col"/>').html(val + '</td></tr>'));
                        break;
                }
            }  else {
                $(selector).append(row); 
                $(selector).append($('<tr>' + '<td class="cont-desc-row">' + (val) + '</td>' + '</tr>'));
            }
        }
    } 
}
// use this to set the colspan attr with jquery b/c it cannot be done when building the table
$('td.cont-desc-row').attr('colspan', 9);
function filterTable(segName) {
var filter, activeTable, tr;
var dirFilter = document.getElementById("dir-menu").value.toUpperCase();
var officeFilter = document.getElementById("sca-menu-1").value.toUpperCase();
var activeTabID = $('.tab-link:not(.non-active-tab)').attr('id');
var activeTableID = activeTabID.replace('btn', 'table');
activeTable = document.getElementById(activeTableID);
tr = activeTable.getElementsByTagName("tr");

var yearFilter = document.getElementById("sca-menu-2").value.toUpperCase();

var filter3 = document.getElementById("sca-menu-3").value.toUpperCase();

var addFilter = document.getElementById("sca-menu-4").value.toUpperCase();

var scarbRevFilter = document.getElementById('scarb-review-menu-1').value.toUpperCase();

var contractFilter = document.getElementById('contract-term-menu-1').value.toUpperCase();

filterAll(activeTable, dirFilter, officeFilter, yearFilter, filter3, addFilter, scarbRevFilter, contractFilter, tr, segName);

colorTable(activeTable);
calculateTotalCost();
if (!segName) {
    populateDashboardNumbers();
}
getNumVisibleContracts();