当javascript函数参数未通过时

时间:2015-02-26 01:34:20

标签: javascript ajax

我是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;
    }
}

2 个答案:

答案 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}},第二个参数是监听器,它是在事件触发时将被调用的函数。