我是JavaScript新手,我正在从“Visual Quickstart guide”一书中学习javascript,
我正在努力使用以下代码逻辑,因为函数定义显示它需要一个参数
function getNewFile(evt) {
makeRequest(this.href);
evt.preventDefault();
}
但是当调用函数时,没有传递给它的参数,
function initAll() {
document.getElementById("makeTextRequest").addEventListener("click",getNewFile,false);
document.getElementById("makeXMLRequest").addEventListener("click",getNewFile,false);
}
我不理解没有传递任何参数的函数的默认行为,
书中的完整代码
window.addEventListener("load",initAll,false);
var xhr = false;
function initAll() {
document.getElementById("makeTextRequest").addEventListener("click",getNewFile,false);
document.getElementById("makeXMLRequest").addEventListener("click",getNewFile,false);
}
function getNewFile(evt) {
makeRequest(this.href);
evt.preventDefault();
}
function makeRequest(url) {
if (window.XMLHttpRequest) {
xhr = new XMLHttpRequest();
}
else {
if (window.ActiveXObject) {
try {
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e) {
}
}
}
if (xhr) {
xhr.addEventListener("readystatechange",showContents,false);
xhr.open("GET", url, true);
xhr.send(null);
}
else {
document.getElementById("updateArea").innerHTML = "Sorry, but I couldn't create an XMLHttpRequest";
}
}
function showContents() {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
if (xhr.responseXML && xhr.responseXML.childNodes.length > 0) {
var outMsg = getText(xhr.responseXML.getElementsByTagName("choices")[0]);
}
else {
var outMsg = xhr.responseText;
}
}
else {
var outMsg = "There was a problem with the request " + xhr.status;
}
document.getElementById("updateArea").innerHTML = outMsg;
}
function getText(inVal) {
if (inVal.textContent) {
return inVal.textContent;
}
return inVal.text;
}
}
答案 0 :(得分:1)
以下代码,' getNewFile'方法作为参数传递,并且实际上不会执行,直到“点击”为止。甚至被引发,然后使用期望的参数参数执行。
function initAll() {
document.getElementById("makeTextRequest").addEventListener("click",getNewFile,false);
document.getElementById("makeXMLRequest").addEventListener("click",getNewFile,false);
}
在Javascipt中,函数是对象,如数字,字符串,数组等。如果函数名称没有"()"它后面的双括号(带或不带参数)然后它没有被正确执行,而是被作为参数传递以供将来参考/执行。
以下是将函数作为参数传递的几个简单示例:
示例1
function example1() {
alert('hello');
}
function executor1(f) {
// execute the function passed in through argument 'f'
f();
}
executor(example1);
// example1 isn't executed/called until it's called from within executor1
示例2
function add(a, b) {
return a + b;
}
function multiply(a, b) {
return a * b;
}
function alertMath(a, b, f) {
var result = f(a, b);
alert(result);
}
// alerts the message of "3"
alertMath(1, 2, add);
// alerts the message of "6"
alertMath(2, 3, multiply);
// alerts the message of "3"
// this shows a function being defined inline
alertMath(6, 2, function(a, b) {
return a / b;
});
我希望这会为你提供更多关于这个问题的背景。
答案 1 :(得分:0)
在这里:
function getNewFile(evt) {
makeRequest(this.href);
evt.preventDefault();
}
getNewFile
是函数参考,getNewFile(parameter)
是函数调用。
正如你在这里看到的那样:
document.getElementById("makeTextRequest").addEventListener("click",getNewFile,false);
getNewFile
(函数引用,而不是函数调用)被传递给addEventListener
。根据{{3}},第二个参数是监听器,它是在事件触发时将被调用的函数。