【问题标题】:JavaScript Scope and objectsJavaScript 范围和对象
【发布时间】:2015-07-19 12:36:45
【问题描述】:

将对象从一个函数传递到另一个函数是否需要任何特殊措施?我对面向对象的 JavaScript 比较陌生,所以如果有一个简单的修复方法,请原谅我。 这是我遇到的问题的一些示例代码。

function foo {

    var x = 0;
    var y = 0;
    /* this is the JavaScript Object that is passed in
    cell = {
            left: {x: someInt, y: someInt},
            up: {x: someInt, y: someInt},
            right: {x: someInt, y: someInt},
            down: {x: someInt, y: someInt},
            x: someInt,
            y: someInt
        }
    */    

    this.turn = function(cell){
        console.log(cell);
        processNeighbors(cell);
        smartMove(x,y, cell);

    function smartMove(x,y,cell) {
         // make a smart decision
    }

    function processNeighbors(x, y, cell) {
        console.log(cell); // this is the line of the undefined error
        // process all neighbors
    }
}

我希望两个输出是相同的,但是,processNeighbors 函数内的 console.log() 返回一个有效响应,bar 函数返回一个“无法读取未定义的属性“值”。

所以当一个对象从一个函数传递到下一个函数时,它会超出范围吗?我不会在任何函数中更改对象本身。

【问题讨论】:

  • 这不是“JSON 对象”。它是一个“JavaScript 对象”。学习这种区别是值得的。 JSON 是一种(通常基于字符串的)格式,用于数据交换。
  • 如果对象或任何其他值在从一个函数传递到另一个函数时“超出范围”,那么整个 Web 将戛然而止。
  • “我传递的对象肯定是 JSON”——不,不是,它只是一个对象。
  • @zerkms 和 torazaburo 对不起,我很笨。 非常感谢您的帮助。有一个很好的SO thread 我刚刚读到的两者之间的区别。
  • @SeeDart - 无需道歉! JSON 和 JavaScript 对象之间的区别和关系是一个非常常见的混淆点。感谢您发布指向该其他线程的链接 - 这对于遇到相同问题的其他人应该非常有帮助。

标签: javascript scope


【解决方案1】:

再看看你的代码:

function processNeighbors(x, y, cell) {
    console.log(cell); // this is the line of the undefined error
    // process all neighbors
}

processNeighbors 在函数范围内创建 var cell。 (第三个论点)

因此,当您调用processNeighbors(cell); 时,如果您的函数将是单元格,则x 参数将是未定义的ycell 参数。

要么从参数中删除cell

function processNeighbors(x, y) {
    console.log(cell);
}

// or - if that was the intended way to call the function
function processNeighbors(cell) {
    console.log(cell);
}

或者用正确的参数调用它:

processNeighbors(x,y,cell);

我不会评论您代码中的任何其他错误,因为我认为这些只是复制和粘贴错误。

作为一个非常简单的例子:

var x = 10;
function fn(x) {
    alert(x);
}
function fn2() {
    alert(x);
}
fn(5); // will alert 5
fn(); // will be undefined
fn(x); // will alert 10
fn2(); // will alert 10

【讨论】:

  • 宾果游戏!接得好。 @SeeDart,这是您问题的答案;请务必支持并接受它。
  • 哇...就是这样。抱歉,我的问题最终被调试,而不是实际问题。
  • 别担心,总是这样。如果每次我在调试问题上走错了路,我就有一美元,我现在已经是个有钱人了!
  • 没问题,这样的小错误经常发生。看看有多少人也没有看到这个问题。有时我们只是对最明显的问题视而不见;)
  • 你为什么不做一个 sn-p 以便我们运行它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-10
  • 1970-01-01
  • 2013-05-29
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多