0

最近,我一直在学习 JavaScript。我遇到了一些 JavaScript 错误,上面写着“ _ _ is undefined”——这到底是什么意思,为什么会出现这种情况?我正在或多或少地寻找关于为什么会发生此错误以及可以采取哪些措施来解决它,或者为什么它通常首先会发生的解释。

例如:这里有两个函数(验证和 onSearch)--- 当我尝试运行“onSearch”时,我在控制台中得到 Ran SEARCH... 跟踪,但是它消失了。此外,当我通过 JSHero(尝试调试)运行它时,它告诉我“onSearch”是未定义的,我很好奇为什么。

我有一些使用 ActionScript 开发的经验,但我对 JavaScript 完全陌生。我非常感谢您对这实际上意味着什么的意见和解释。谢谢。

function validate(query){
    console.log("Ran VALIDATE...");
    // Trim whitespace from start and end of search query
    while(query.charAt(0) === " "){
        query = query.substring(1, query.length);
    };

    while(query.charAt(query.length-1) === ""){
        query = query.substring(0, query.length-1);
    };

    console.log("Query length:",query.length);
    console.log("Beginning conditional...");
    // Check search length, must have 3 characters
    if(query.length < 3){
        console.log("Display alert...");
        alert("Your search query is too small, try again.");

        // (DO NOT FIX THE LINE DIRECTLY BELOW)
        searchInput.focus();
    }else{
        console.log("Searching query...");
        onSearch(query);
    };
};

// Finds search matches
function onSearch(query){
//var search = function(query){

    console.log("Ran SEARCH...");
    // split the user's search query string into an array
    var queryArray = query.join(" ");

    // array to store matched results from database.js
    var results = [];

    // loop through each index of db array
    for(var i=0, j=db.length; i<j; i++){

        // each db[i] is a single video item, each title ends with a pipe "|"
        // save a lowercase variable of the video title
        var dbTitleEnd = db[i].indexOf('|');
        var dbitem = db[i].tolowercase().substring(0, dbTitleEnd);

        // loop through the user's search query words
        // save a lowercase variable of the search keyword
        for(var ii=0, jj=queryArray.length; ii<jj; ii++){
            var qitem = queryArray[ii].tolowercase();

            // is the keyword anywhere in the video title?
            // If a match is found, push full db[i] into results array
            var compare = dbitem.indexOf(qitem);
            console.log("Compare:",compare);
            if(compare != -1){
                results.push(db[i]);
            };
        };
    };

    console.log("Hello");
    results.sort();

    // Check that matches were found, and run output functions
    if(results.length === 0){
        noMatch();
    }else{
        showMatches(results);
    };
};

EDIT** "db" 在外部文件中定义。它只是一个 URL 的数组。它仍然说它也没有定义,这就是我要问的。

你如何定义 1) 一个变量 2) 一个函数

4

3 回答 3

2

如果您得到TypeErrorBlah未定义”或“无法读取属性”fooundefined字样,则表示您有一个具有value undefined的变量或属性,这是变量的默认值,直到您为其赋值。

这与拥有尚未定义的变量并尝试读取其值ReferenceError相反,后者将触发 a 。

例如,考虑以下内容:

var foo;
console.log(foo.bar); // "TypeError: Cannot read property 'bar' of undefined"

foo变量存在,但其值为undefined,因此尝试从中读取属性会导致错误。

与之对比:

console.log(missing); // "ReferenceError: missing is not defined"

这里,符号missing没有定义;引擎不知道你在说什么。这通常表示缺少var陈述。

旁注:如果你分配给一个你从未声明过的变量(在 ES3 或 ES5 中的“松散”模式下), JavaScript 会有一个非常令人惊讶的行为:它会创建一个全局变量。我称之为隐式全局的恐怖。这意味着如果不是console.log(missing);上面的,我这样做了:

missing = "foo";

...我将创建一个新的全局变量,即使该代码在函数中。值得庆幸的是,在 ES5 中,我们可以使用“严格”模式,这使得ReferenceError它一直都应该如此。:-)

于 2013-11-02T17:41:09.603 回答
0

这通常意味着您请求的“事物”不存在(或者至少无法被请求它的函数找到)。这可以是变量、对象或函数。

onSearch您谈论的情况下,很可能找不到该功能。可能是文件请求后加载了其中包含函数的文件(onSearch在 b.js 中也是如此,请求它的文件在 a.js 中。a.js 在您<head>之前的 b.js 中)。因此它还不存在,因为 javascript 文件是线性加载的。

于 2013-11-02T17:40:23.287 回答
0

你的问题

问题不在于onSearch未定义,而是它使用了db未定义的变量。

案例

(从现在开始我将假设qwertyuiopasddsghjdsvjkfhjkl未声明)

在以下情况下您会看到未定义的错误:

  • 您使用未声明的变量。

    qwertyuiopasddsghjdsvjkfhjkl; // ReferenceError: qwertyuiopasddsghjdsvjkfhjkl is not defined
    
  • 您在已声明但未定义的变量上使用属性: var a; ab; // 类型错误:a 未定义

在以下情况下变量未定义:

  • (错误)你还没有声明它

    // qwertyuiopasddsghjdsvjkfhjkl is undefined
    qwertyuiopasddsghjdsvjkfhjkl; // ReferenceError: qwertyuiopasddsghjdsvjkfhjkl is not defined
    
  • (无错误)您已声明它但它没有价值

    var a; //a is undefined
    
  • (没有错误)您将变量分配给void(0)(您可以0随一切更改)或未修改undefined

    var a = undefined; //a is undefined
    var a = void(0); //a is undefined
    undefined = 'abc';
    var a = undefined; //a is NOT undefined
    

如何检查

如果您不知道变量是否未定义,则可以使用

  • typeof myVar === 'undefined'

    它在以下情况下返回true

    • myVar未声明
    • myVar已声明但未定义

    false如果myVar已声明myVar且未定义,则返回

  • myVar === void(0)

    true如果myVar已声明myVar且未定义,则返回

    false如果myVar已声明myVar且未定义,则返回

    如果myVar未声明,则会引发错误

  • myVar === undefined

    就像myVar === void(0)没有undefined被修改一样。

  • !myVar,if(myVar)

    它返回trueifmyVar被声明并且

    • myVar未定义
    • 或者
    • myVar是假的 ( null, 0, false, '')

    false如果myVar已声明且myVar为真,则返回

    如果myVar未声明,则会引发错误

于 2013-11-02T17:45:33.727 回答