Javascript 一个函数在作用域内,一个函数在作用域外,即使两者都定义在同一位置
这两个函数都是从document.ready调用的: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(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();